1

我正在做 K&R 的书。如果我检查 a == 则一切正常,但如果我检查 !=,则不会打印直方图。这有效

  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;
    }
    }

我想要不是制表符、空格或换行符的每个字符。所以我写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. 如果OR语句中的任何一个为真,那么整个语句为真并且body应该执行,那么为什么它不执行呢?

感谢您注意到第一个片段中的错字,我更正了它,但我想问的是为什么第二个片段不起作用?

答案:这非常有效:

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')  

在你的第二个片段中

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

每个字符要么是“非空格”、“非制表符”或“非换行符”。例如,制表符是“不是空格”和“不是换行符”。所以 if 条件永远不会是假的。听起来您想查找“不是空格”和“不是制表符”和“不是换行符”的字符。

于 2013-10-02T17:34:37.050 回答