2012-03-19 3 views
1

Я новичок в C и есть этот пример из Язык программирования C книги:программа C не читает ввод, не дает выход

#include <stdio.h> 

#define IN 1 /* inside a word */ 
#define OUT 0 /* outside a word */ 

/* count line and words and characters in input */ 

main() 
{ 
    int c, nl, nw, nc, state; 

    state = OUT; 
    nl = nw = nc = 0; 
    while ((c = getchar()) != EOF) { 
      ++nc; 
      if (c == '\n') 
        ++nl; 
      if (c == ' ' || c == '\n' || c == '\t') 
        state = OUT; 
      else if (state == OUT) { 
        state = IN; 
        ++nw; 
      } 
    } 
    printf("%d %d %d\n", nl, nw, nc); 
} 

код компилируется штраф в терминале с: gcc -o count count.c Когда я запускаю его с помощью: ./count, давайте проверим его, дадим мне новую строку для ввода ввода. Я набираю текст, нажимаю Return, и он дает мне еще одну пустую строку для ввода текста, а не выводя что-либо. Что я делаю неправильно? Я делал несколько других примеров с помощью ввода, и я получал выход, но ни один из кода, который я использую из этой книги, не работает для меня сейчас. Большое спасибо.

+2

Попробуйте нажать CTRL-D в конце списка. Или, передайте ему текстовый файл, а не консольный ввод. – blueshift

ответ

5

Значение «EOF» не равно новой строке aka '\ n'. «EOF» - это значение, отправленное при нажатии ctrl + d, когда стандартный ввод (aka getchar()) поступает с клавиатуры или когда вы достигаете файла, если вы перенаправляете стандартный ввод из файла (который вы бы делать с ./count < файл).

+0

+1; Дальнейшее разъяснение для OP: эта программа не предназначена для вывода какого-либо результата до полного прекращения ввода, что может быть сделано, как указано выше. Если вы хотите использовать итоговые значения, переместите printf (...); внутри while (...) {...}; – FrankieTheKneeMan

1

Нажмите Ctrl-D, который является символом EOF для Linux, предполагая, что это то, что вы используете.

1

Цикл в коде говорит, чтобы итерация продолжалась до тех пор, пока не будет прочитан символ EOF (End-of-File). Если вы используете Linux, это будет Ctrl + D. Для Windows вы должны нажать Ctrl + Z и ввести ключ.

0

Если предполагаемый результат программы - подсчет количества строк, слов и символов на входе, важно, чтобы была четкая демаркация, где начинается вход и где он заканчивается.

В этой конкретной программе ввод начинается, когда начинается цикл while (и входной символ не является EOF), и вход останавливается при вводе символа EOF.

Значение и использование EOF должно быть четким.

EOF - это макрос, возвращаемый функциями потока для указания условия конца файла. Этот символ объявляется в stdio.h.

При сравнении формы:

(! (С = GetChar()) = EOF)

сделано, что происходит внутри, что значение ASCII входного символа в 'с' сравнивается со значением ASCII EOF.

После ввода ввода вы нажмете «Return». «Возврат» соответствует строке «Новая линия линии», а для значения ASCII - 10 (Десятичная). EOF в ASCII соответствует Конец передачи и имеет значение ASCII 4 (десятичное).

Итак, если вы продолжаете нажимать «Return» после входов, программа будет ожидать входы бесконечно. Чтобы указать конец ввода, необходимо ввести EOF. EOF соответствует Ctrl-D (значение ASCII 4).

Итак, в вашей программе нет ничего плохого. Все, что вам нужно сделать, это в конце ввода, вместо того, чтобы нажимать «Return», «Сделайте контрольный-D».

0

Хм, я люблю K & R. Получил этот вопрос раньше, нужен финал. Как Ctrl + d, вы можете попробовать: ls | ./count

Смежные вопросы