2010-09-05 2 views
4

Я учу себя C с K & R и в тупике один из примеров в книге. Я компилирую код точно так, как он написан в примере, но он не делает то, что авторы говорят, что это будет. Предполагается, что программа предназначена для подсчета символов. Указанный код выглядит следующим образом:Проблема с примером 1.5.2 в книге K & R на C

#include <stdio.h> 

/* count characters in input; 1st version */ 
main() 
{ 
    long nc; 
    nc=0; 
    while (getchar() != EOF) 
    ++nc; 
    printf("%ld\n", nc); 
} 

Для его компиляции я заменю main() на int main(). Но я полагаю, что это не относится к вопросу. Программа компилируется и работает нормально. Но он просто не учитывает символы, как это было написано. Я что-то упускаю? Может ли что-то измениться в том, как современные компиляторы рассматривают пример кода, такой как это, поскольку книга была написана? Любая помощь, которую могут оказать хорошие люди на этой доске объявлений, была бы весьма признательна.

Best, Dan

+1

Какой вклад вы даете программу и что печатается? – Mark

+1

Вы даете программе файл для stdin? например программа <файл. –

+0

Получите себе второе издание K & R. Первое издание представляет собой музейный экспонат, а к 20-летнему стандарту C89 - к десятилетию. (У меня есть копия первого издания, но я по-прежнему ценю его. Но сейчас не так, чтобы узнать, где C учится. Второе издание - это то, что нужно использовать.) –

ответ

5

Программа выводит только количество символов после чтения «конца файла». С помощью интерактивного ввода вы можете сгенерировать «конец файла» с помощью ctrl + d (по крайней мере, на * NIX, не знаете о Windows). Зная это, программа работает правильно здесь.

+1

Control-Z для Windows для EOF –

5

Кроме возвращаемого значения основной это выглядит нормально.

ли вы сделать CtrlD (Unix) или CtrlZ (Windows) в конце ввода, если вы вводите значения с клавиатуры?

5

Хотя другие ответы технически правильно, я чувствую, что этот пример (1.5.2) и следующий (1.5.3) являются педагогически запутанными. Просто google «character counting 1.5.2», и вы найдете много других, которые оказались подхваченными этим примером, так же, как это сделал OP. Причина, по которой это так запутанно, заключается в том, что в тексте нет объяснения о том, как генерировать символ EOF в интерактивном режиме, а предыдущие примеры выводили результаты сразу после ввода «return». Таким образом, любой новичок в C было бы предположить, что программа в 1.5.3 должны делать то же самое ...

Я хотел бы предложить следующий альтернативный код, который производит ожидается результат:

#include <stdio.h> 
#define  EOL '\n' 

main() 
{ 
    long nc; 
    int c; 
    nc = 0; 

    while ((c = getchar()) != EOF) 
    { 
     ++nc; 
     if (c == EOL) 
     { 
      /* Print number of input characters (not including return character) */ 
      printf("%ld\n", nc-1); 
      nc = 0; 
     } 
    } 
} 

Единственный элемент C, который еще не объяснен в тексте, - это оператор if, который фактически объясняется в следующем разделе (1.5.3). Я надеюсь, что этот небольшой альтернативный пример послужит тому, чтобы помочь другим, увлеченным оригинальным примером из книги K & R. Хороший «Упражнение 1.7b» будет исследовать различия между двумя версиями и объяснить проверить, что они выводят одинаковые результаты (после прочтения о CtrlD/CtrlZ из других ответов).

+0

Спасибо! этот пример был тем, что мне нужно было понять! –

0

Следует также отметить, что Ctrl + z (который будет отображаться как^Z в консоли) не может быть просто введен в любом месте входа в консоль; вы должны ввести его в качестве первого ввода вашей последней строки строки/текста/символов. E.G

Picture of initial input Ctrl + z

Как вы можете видеть в этом примере я напечатанный в случайном тексте и после того, как каждая строка закончилась, я нажал войти. ТЕПЕРЬ ВАЖНО !!! Когда вы нажмете enter в последней строке, он вызовет EOF (End-of-File), и вы получите остальную часть исполняемого кода, как это первоначально предполагалось.

Fully executed code

Примечание:

  • Даже если Ctrl + Z отображается как^Z, то не учитывается, как персонаж по программе однако много раз нажать ее.
  • Также символы после ctrl + z не учитываются.
  • Enter отсчитывается этой программой

Источник: EOF in Windows command prompt doesn't terminate input stream