c - 来自 K&R 的练习 1-13

标签 c

我正在做 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;
    }
    }

我想要不是制表符、空格或换行符的每个字符。所以我写了 c != '\t' || c!= ' ' || c!= '\n'. 我的意思是 如果 c 不是 (!=) space(' ') 那么它的 1(true) OR(||) 如果 c 不是 (!=) tab('\t') 那么它的 1 OR(||) ...等等。 如果 OR 语句中的任何一个为真,则整个语句为真,主体应该执行,那么它为什么不执行呢?

感谢您注意到第一个代码段中的拼写错误,我已更正它,但我想问的是为什么第二个代码段不起作用?

回答: 这非常有效:

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

最佳答案

在第一个片段中

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

错了。将此更改为

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

之后,如果您的第一段代码运行良好,则进行更改

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

在你的第二个片段中

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

关于c - 来自 K&R 的练习 1-13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19143083/

相关文章:

c - scanf() 将换行符保留在缓冲区中

为裸机 ARM 正确编译 Rust 代码作为静态库和 x86_64 的二进制文件?

c - float 与 c 中的双重奇怪行为

c - 我有错误,因为表达式必须是可修改的值

c - 释放分配的内存时出现不同的错误消息

c - 包含头文件,但仍 undefined reference

c - 当按下 control+d 时 fgets 不会停止读取

c - 动态分配数组与使用全局作用域自动声明数组(C 语言)

c - openGL glDrawPixels

c - 奇怪的结构和 typedef 定义