цикл не выполняет никаких инструкций вне цикла - PullRequest
0 голосов
/ 31 октября 2011

Для справки, я копирую этот пример (почти) букву для письма со страницы 18 в Язык программирования C, второе издание .

#include <stdio.h>
/*count characters in input, 2nd version*/
main(){
    double n;
    for (n = 0; getchar() != EOF; ++n)
        ;
    printf("%.0f\n", n); /*this never prints*/
}

Я не был уверен, была ли это моя версия gcc (я нуб):

% gcc --version
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.

Поскольку

for (n = 0; getchar() != EOF; ++n)
    printf("%.0f",n); /*returns 0123456...n*/

Я попытался напечатать "foo" вместо значения nпросто чтобы посмотреть.Он все еще не печатает.

Что мне здесь не хватает?Я не люблю двигаться вперед, игнорируя такие мелкие проблемы.

====================================

РЕДАКТИРОВАТЬ

Таким образом, конечный результат должен быть:

% gcc ./counter.c -o ./counter
% ./counter
foo
3

Прямо сейчас это вывод из первого фрагмента:

% ./counter
foo
0123

И второй:

% ./counter
foo

^C
%

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

Если вы используете OSX или Linux, вам нужно набрать Ctrl+D в отдельной строке, чтобы сгенерировать EOF символ .В Windows Ctrl+Z на отдельной строке.Не вводите Ctrl+Z в поле unix, потому что это просто отправит ваш процесс в фоновый режим.

Вы вводите Ctrl+C, что является разрывом, и отправит SIGTERM в вашу программу.

На моем Mac я получаю:

$ ./foo
hello
6D

Или, если вы не хотите сигнализировать о состоянии EOF, используйте echo и pipe:

$ echo "hello" | ./foo 
6

Примечаниечто EOF должен быть на своей линии.^D печатается, а затем 6 перезаписывает ^, так что похоже, что результат будет 6D.

Конечно, в двух приведенных выше примерах подсчитываются следующие символы: h e l l o \n.Если вам не нужен перевод строки, сделайте следующее:

$ echo -n "hello" | ./foo 
5
1 голос
/ 31 октября 2011

У вас не должно быть этой точки с запятой после for. Это означает, что единственная вещь в вашем цикле - это пустое утверждение.

На самом деле Дэвид прав.Пустой оператор - это единственное в цикле, но это нормально.Он будет считать количество символов.Затем, вне цикла, будет напечатано итоговое значение.

Эта демонстрация показывает, что она работает должным образом (ввод 6 символов приводит к печати 6).Однако для ясности я бы использовал скобки или оставил отступ, как в оригинале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...