2011-07-12 19 views
1

私はC言語の初心者であり、 "The C programming language"という本を買って読んで、すべてのことをやり始めました。本には、文の行数、単語数、文字数を表示するコードがあります。これは本のコードです。数字を印刷しないプログラム

#include <stdio.h> 
#define IN 1 /* inside a word */ 
#define OUT 0 /* outside a word */ 


/* count lines, words, and characters in input */ 
main() 
{ 
int c, nl, nw, nc, state; 

state = OUT; 
nl = nw = nc = 0; 
while ((c = getchar()) != EOF) { 
     ++nc; 
     if (c == '\n') 
      ++nl; 
     if (c == ' ' || c == '\n' || c = '\t') 
      state = OUT; 
     else if (state == OUT) { 
      state = IN; 
      ++nw; 
     } 
} 
printf("%d %d %d\n", nl, nw, nc); 
} 

何らかの理由で、printfで印刷する必要がある値が表示されません。私は本当に何が間違っているのか分からない。 whileループでprintfを置くと数字だけが出力されますが、値が変わるたびに数字が出力されるため、これは正しいとは言えません。

+1

いいですね。あなたがそれをデバッガに投げ込んで、あなたが到達するのを待っているprintfにブレークポイントを置くとどうなりますか?実際に出力を見る前にprintfが実行されていて、コマンドウィンドウが閉じている可能性はありますか? printfの後にgetchar()を追加してみてください。 –

+4

c == '\ t'の代わりにc = '\ t'を書いたことに注意してください。 –

+0

これは本の誤植でなければなりません。 printfの後にgetchar()も置いていますが、何も起こりません。 – captain

答えて

3

あなたはこの行のタイプミスを持っている - c = '\t'の割り当ては常に、変更を修正するには、真の

if (c == ' ' || c == '\n' || c = '\t') 

に評価=ん、なぜあなたの質問に答えるために

if (c == ' ' || c == '\n' || c == '\t') 

を==しますそれは何も印刷されません - 私は、コンパイラがあなたのプログラムにリンクされていないというエラーや警告を出すので、実際にはソースコードをコンパイルしていないと思います。あなたが以前にコンパイルしたコードをすべて読み込みます。

+0

これは、なぜ私たちの多くが次のように書いているのかを正確に示しています: 'if( '' == c || '\ n' == c || '\ t' == c)' - 誤って代入としての比較では、コンパイルエラーが発生します。もちろん、 'if(isspace(c))'はもっと良いでしょう。 –

+0

正解ですが、読みにくいです。私たちの言う通りではありません。ほとんどのコンパイラ(現代版のgccなど)はこれに関する警告を出します。 – Soren

+0

最初はちょっとびっくりしましたが、数週間後には消えてしまいました。個人的には、すべてのコンパイラで常に動作するものがいくつかありますが、いくつかのコンパイラのバージョンによっては動作しますが、それらを使用しても無効にすることができます。 –

1

gccはこの行のコンパイルエラー与える:その行@見

if (c == ' ' || c == '\n' || c = '\t') 

を、それはタイプミスを見つけるのは簡単です:平等のテストを逃しc = '\t')

、ありませんか? :)

1

あなたはSTDIN(キーボード)から入力を読み込んでおり、 "ファイルの終わり"にループを残しているようですが、これは起こりません。他の答えが示唆するようにします。

0

他にも触れられているように、入力ループを終了するにはEnd-of-File信号を送信する必要があります。これは、実行している環境によって異なります.WindowsではCtrl + Z、* NIX環境ではCtrl + Dでなければなりません。私はこれを新しい行に入力し、通常のIDE(Code :: Blocks)を使用するときはEnterを押す必要がありました。

What it looks like

、K & R(1 & 2)が書かれた時点で、あまりにもそのコマンドラインプログラミングを覚えて当たり前だった、と一般的に、あなたはあなただけのプログラムを終了した場合に出力が表示されるように期待します。あなたは結果を表示することができます前に、いくつかのIDEには、プログラムの最後に自分の端末エミュレータを終了しますので、あなたは、プログラムの最後に

printf("\nPress return to continue"); 
getchar(); 

のようなものを追加する必要があります。または、Windowsの場合はcmd.exe、gnome-terminal、yakuakeなどのOSが提供するものを使用して、自分自身をOSターミナルエミュレータから実行します。 if (c == ' ' || c == '\n' || c = '\t')で上に指摘したように、それは平等の問題だったフォルダに移動し、

your_executable.exe 

または

./your_executable 
+0

そして、実際にストリームに改行文字が残っているので、実際には2番目のgetchar()を追加する必要があります。 – thelionroars1337

0

。 このようなバグを警告するEclipse CDTのような良いIDEを使用することをお勧めします。