Мой вопрос просто: «Почему мой код в строках 10 и 11 не работает должным образом?» Предполагаемая цель моего кода - делать то же, что и исходный код K&R, но НЕ считать nc всякий раз, когда (getchar() == '\n'), не могли бы вы меня просветить?
слегка измененный код K&R:
/** K&R - 1.5.2 Character Counting **/
#include <stdio.h>
/* count characters in input; 1st version */
main(){
long nc;
nc = 0;
while (getchar() != EOF){
if (getchar() != '\n'){
++nc;
}
}
printf("%ld\n", nc);
}
Я использую 64-разрядную версию Windows 7, CodeBlocks10.05, компилятор GNU GCC.
мой текущий прогресс и понимание:
в примере запуска я ввожу слово two
и нажимаю Enter, что равняется 4 входам, после чего я нажимаю ctrl+Z, чтобы ввести символ ^Z
или EOF. Затем программа печатает 1
. Я ожидал, что он напечатает 3
. Я полагаю, что единственное логическое объяснение состоит в том, что он делает прямо противоположное тому, что я намеревался (он только считает символы новой строки?). Оказывается, если я наберу слово two
и нажму Enter, скажем, 4 раза, будет напечатано 4
. Кажется, что он подсчитывает nc
для каждого введенного символа новой строки, но все же, если я нажимаю только ввод (в данном случае 4 раза), а затем EOF, он всегда печатает 0
. После дальнейших экспериментов, некая невидимая рука 4, возможно, является магическим числом для этой программы. Если я запущу его и точно нажму клавишу ввода (число, кратное 4) раз, а затем EOF напечатает 0
. Однако, если я нажму Enter еще несколько раз, EOF ничего не сделает, и я должен ввести в ^Z
две строки, одну за другой, чтобы правильно завершить цикл while, и он напечатает 1
. Это сбивает с толку!