2017-05-24 8 views
1

私は検索しましたが、解決策が見つかりませんでした。 プログラムは、タブ、改行、およびスペースを数えます。K&Rエクササイズ1-8。私のコードを正しく動作させることができます

#include <stdio.h> 

int main(void) 
{ 
    int c,nl,tab,blank; 
    tab = 0; 
    blank = 0; 
    nl = 0; 

    while((c = getchar()) != EOF) 
    { 
     if(c == '\n'); 
      nl++; 
     if(c == '\t'); 
      tab++; 
     if(c == ' '); 
      blank++; 
    } 

    printf("newline: %d tab: %d blank: %d\n", nl,tab,blank); 

    return 0; 
} 

私はEOFを通知するCTRL-Dを使ってFreeBSD上でこれを実行すると、すべての変数が同じ値で表示されます。私は18

として、それは18のように改行を表示 「タブはあなたがCTRL-Dを入力を入力する方法をこんにちは空白」を18として、タブ、空白を入力すると、間違った私のコードですか?明らかにそれはありますが、何が間違っていますか?

+4

は、あなたのif文の末尾から、セミコロンを取ります、例えば'if(c == '\ n');' - > 'if(c == '\ n')'となります。 (また、そのようなバグではなく、コードを適切にフォーマットする方法を学んでください。) –

+0

ありがとう、私の間違いをformatingと。 @PaulR – clawhammer1234

+2

gccまたはclangを使用している場合、 '-Wall'警告フラグを指定してコンパイルすると、この問題が検出されます。 –

答えて

1

コメントによると、ここでの問題はif文の後にセミコロンがあることです。通常、ステートメントが次のように中括弧で囲まれている場合:

if(foo) { 
     //your code here 
    } 

これを試してみてください。

+0

ありがとう、@austinhoffmann – clawhammer1234

0

if (something);は、文字通り:の場合は何もしません。ifステートメント構文を使用すると、末尾にセミコロンを置くと、条件somethingがtrueの場合に実行されるnullステートメントに変換されるため、条件が指定されても何も行われません。 ifステートメントの後に3つの変数をインクリメントすると、ファイルから読み取った各文字ごとにインクリメントされます(すべて)。

FreeBSDシステムで
if(c == '\n') /* no semicolon here */ 
     nl++; 

ソリューション

だけのように、条件の右括弧の後;を消去

$ make pru$$ 
cc -O -pipe pru24720.c -o pru24720 
$ pru$$ <pru$$.c 
newline: 23 tab: 0 blank: 123 
+0

ありがとう、私はあなたの最後に何をするか分からない。私はちょうどCで始まっているので、私はそれまでにうまくいくと思う。そして、私もUNIXを学び始めているので、多くのことが混乱していますが、私はちょっとしたことを学んでいます。 – clawhammer1234

+0

私はここで質問に答えると、常に '$$'をシェルのpidに置き換えて 'pru $$。c'というファイルを呼び出すので、別の番号を取得します(そしてすべてのシェルセッションを修正しました)。この場合、シェルのpidは '24720'だったので、ファイルの名前です...最後に、' pru24720.c'(ソースコード)の入力を 'pru24720'ファイルからリダイレクトしてサンプルコードの行、タブの数、および空白の数です。 –

+0

これはunixコマンドでビルドされていますか、それともあなたが書いたものですか? – clawhammer1234

関連する問題