2011-01-12 11 views
3

上のCで文字を数える、私はストレートK & RのouttaのMac OS X

#include <stdio.h> 

main() { 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) 
     ++nc; 
    printf("%ld\n", nc); 
} 

を持って、それを実行し、 "12345" のタイプIは、Mac OS X上でので、私はそれをコンパイルし、改行のためにEnterキーを押してください(これは私が推測する6番目の文字です)。そしてCtrl-Dを押してEOFを送ります。

「6D」が印刷されます。なぜそこにDがあるの?改行ではなく "12345"の5文字を​​数えるだけのプログラムを作成するにはどうすればよいですか?私は最後に1つを減算すべきですか? Dの印刷を中止するにはどうすればよいですか?何が起こる

答えて

9

は、端末が実際にエコーあなたのコントロール-D(および^Dなど印刷物それを)あなたはそれを入力しますが、その後、あなたのプログラムが数とラインフィードでその行を上書きすることです。したがって、1桁の数字は^を上書きしますが、Dはそこに残ります。

10文字以上を入力するか、書式文字列の末尾にスペースを追加してコードを変更すると("%ld \n")、プログラムは^Dを上書きします(端末ではまだエコーされていますが) )

+0

ああ、私は見る!どうもありがとう! –

+0

@ user519504:その場合は、回答を「受け入れ」にしてもよろしいですか?乾杯。 – Gyom

1

プログラムが正しく動作している:それはDには、次を残し^上で6をバックラインの先頭に行き、あなたのプログラムのプリント^ターミナルウィンドウが印刷されたので、あなたは6Dを参照してください6.

を印刷していますD.出力をファイルにリダイレクトしてみるか、答えが1桁以上ある十分な入力を与えて、Dが表示されないようにしてください。

改行のため、答えは5ではなく6になります。最後に改行を数えたくない場合は、1を引いてください。改行を数えたくない場合は、改行があるたびに1を引いてください。

+0

すごく、ありがとう! –