2011-09-18 8 views
1

私は現在、K & Rを使ってCを学習しようとしていますが、例1.5.2で完全に困惑しています。なんらかの理由で、ncを印刷する代わりにCtrl-Zを押した後、ncに2を掛けて印刷します。この問題の原因は何か分かりません。私が使用していますコンパイラは、ここでのVisual Studio 2010でコードです:K&Rエクササイズで困惑1.5.2

#include <stdio.h> 

main() 
{ 

long nc; 

nc = 0; 
while (getchar() != EOF) 
    ++nc; 
printf("%1d\n", nc); 


} 
+0

私はあなたがそれが2を出力」を意味すると仮定します"、" ncに2を乗じた "ではありません。私は、Ctrl + Zは2回のキーストロークを生成していると思います。 –

+1

'enter'はキーストロークです。 –

+0

ああ、今見ているので、すべてのキーストロークが1回ではなく2回登録されたのはこのためです。 – Emryss

答えて

2

1D%であるべきである理由。

あなたの入力がある場合:

1<enter> 
1<enter> 
1<enter> 
^z 

出力、それはなります

1

わからないあなたはあなたが記述の動作を取得しかしenterがキーストロークであるため、それが%ldはない

0

があなたのエラーを再現できませんでした。私は、

#include <stdio.h> 

main() { 
    int nc = 0, ch; 

    while ((ch = getchar()) != EOF) { 
      printf("%d\n", ch); 
      ++nc; 
    } 
    printf("nc - %1d\n", nc); 


} 

をいくつかのデバッグ文を追加し、Windows上でgccでそれを試してみました:

E:\temp>gcc eof.c 

E:\temp>a 
^Z 
nc - 0 

E:\temp>a 
foo bar 
102 
111 
111 
32 
98 
97 
114 
10 
^Z 
nc - 8 

し、Visual Studioの2008年:

E:\temp>cl eof.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

eof.c 
Microsoft (R) Incremental Linker Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:eof.exe 
eof.obj 

E:\temp>eof 
^Z 
nc - 0 

E:\temp>eof 
foo bar 
102 
111 
111 
32 
98 
97 
114 
10 
^Z 
nc - 8 
+0

彼は入力した各文字の後に 'enter'を打っていました(' nc'は期待したものの2倍の大きさです)。コメントを参照してください。 –

+0

ああ、いいキャッチ。 :) –

関連する問題