1

私はK&Rの本をやっています。== をチェックするとすべてが機能しますが、!= をチェックするとヒストグラムは出力されません。これは機能します

  while( (c = getchar()) != EOF  )
    {
      if(c == ' ' || c == '\t' || c =='\n')
    {
      state = OUT;
      if(wc>0)
        ++numOfWords[wc];
      wc = 0;
    }
      else
    if(state == OUT)
      state = IN;

      if(state = IN)
    ++wc;
    }

ただし、if セクションをこれに変更しても、次のようにはなりません。

    if(c != ' ' || c != '\t' || c !='\n'){
    if(state == OUT){
      state = IN;
      ++wc;}
    else
      ++wc;
      }
      else
    {
      state = OUT;
      if(wc>0)
        ++numOfWords[wc];
      wc = 0;
    }
    }

タブでもスペースでも改行でもないすべての文字が必要です。だから私は 、ORステートメントのいずれか1つが真である場合、ステートメント全体が真であり、本文が実行されるべきであると解釈することを書きました。なぜ実行しないのですかc != '\t' || c!= ' ' || c!= '\n'.? If c is not (!=) space(' ') then its 1(true) OR(||) if c is not (!=) tab('\t') then its 1 OR(||) ...so on.

最初のスニペットのタイプミスに気づいてくれてありがとう、私はそれを修正しましたが、2 番目のスニペットが機能しないのはなぜですか?

回答: これは完全に機能します:

if(c != ' ' && c != '\t' && c !='\n' && c != '"' && c!= '.' && c != ','){
if(state == OUT){
  state = IN;
  ++wc;}
else
  ++wc;
  }
  else
{
  state = OUT;
  if(wc>0)
    ++numOfWords[wc];
  wc = 0;
}
4

3 に答える 3

1

if ステートメント全体を否定する場合は、 if(!(c == ' ' || c == '\t' || c =='\n')) または論理的に同等の if( c != ' ' を試してください&& c != '\t' && c == '\n'))。個人の要素を否定するだけでは十分ではありません。or を and に変更する必要があります。

于 2013-10-02T17:33:31.447 に答える
1

最初のスニペットで

 if(state = OUT)
 ...   
 if(state = IN)  

間違っている。これをに変更

  if(state == OUT)
  ...
  if(state = IN)   

その後、コードの最初のスニペットがうまく機能する場合は、変更します

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

2番目のスニペットで

if(c != ' ' && c != '\t' && c !='\n')
于 2013-10-02T17:34:17.843 に答える
0

すべての文字は、「スペースではない」、「タブではない」、または「改行ではない」のいずれかです。たとえば、タブは「スペースではなく」、「改行でもありません」。そのため、if 条件が決して false になることはありません。「スペースではない」「タブではない」「改行ではない」文字を探したいようです。

于 2013-10-02T17:34:37.050 に答える