私の質問は、単純に「10 行目と 11 行目のコードが正しく機能しないのはなぜですか?」ということです。私のコードの意図した目的は、元の K&R コードが意図したとおりに実行することですが、(getchar() == '\n') いつでも nc をカウントしないようにすることです。
わずかに変更された 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
、Enterキーを単独で(この場合は4回)押してからEOFを押すと、常に出力されます0
. さらに実験を重ねた結果、目に見えない 4 はおそらくこのプログラムにとって魔法の数であることがわかりました。起動してEnterキーを正確に(4で割り切れる数)押すと、EOFが出力され0
ます。^Z
ただし、Enter キーを何度か押した場合、EOF は何もしません。whileループを正しく終了するには、2 行ずつ入力する必要があり、出力され1
ます。これは私の心を揺さぶっています!