1

以下は、スペース、改行、またはタブがキーボードから入力された回数をカウントするために作成した小さなプログラムです。

ただし、何が問題なのかわかりません。スペースや改行がいくつ入力されても、カウントが常にゼロになります。

#include <stdio.h>

/*program to count blanks ,tabs and newlines */

int main()
{
       int cnt_space=0,cnt_newline=0,cnt_tab=0;
       int c;

       while(c=getchar()!=EOF)
       {
         if(c==' ')
         {
           ++cnt_space;
         }
         if(c=='\n')
         {
           ++cnt_newline;
         }
         if(c=='\t')
         {
           ++cnt_tab;
         }
       }

       printf("spaces=%d\nnewlines=%d",cnt_space,cnt_newline);
       return 0;
 }
4

2 に答える 2

8

これを変える

while(c=getchar()!=EOF) 

while((c=getchar())!=EOF)

これが重要な理由は、getchar の戻り値が最初に EOF と比較され、結果が 0 または 1 になるためです。次に、結果の値が c に格納されます。したがって、どの条件にも一致しません。

getchar が最初に EOF と比較される理由は、!= 演算子が = 演算子よりも優先順位が高いためです。

于 2012-06-29T15:34:50.087 に答える
2

ループ ヘッダーに括弧のペアがありません。

while ( (c=getchar()) != EOF ) {
    ....
}

現在、あなたの割り当てはまたは のgetchar()!=EOFいずれ1かである を取り、それ0を に割り当てていcます。これは、スペース' 'または'\n'.

C での演算の優先順位について詳しくは、このチャートをご覧ください。ただし、通常は、必要な操作順序を強制するために括弧のペアを追加しても問題はありません。書いている式の操作の優先順位について疑問を持っている場合、読者も疑問を抱く可能性があります。

于 2012-06-29T15:35:17.587 に答える