C语言 与比较运算符混淆

eyh26e7m  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(216)

这个解答是针对C编程语言书中的1-12练习的。问题是写一个程序,每行打印一个输入单词。
我找到了以下解决方案:

#include <stdio.h>
int main(void)
{
  int c;
  int inspace;

  inspace = 0;
  while((c = getchar()) != EOF)
  {
    if(c == ' ' || c == '\t' || c == '\n')
    {
      if(inspace == 0)
      {
        inspace = 1;
        putchar('\n');
      }
      /* else, don't print anything */
    }
    else
    {
      inspace = 0;
      putchar(c);
    }
  }
  return 0;
}

有人能解释一下为什么在if参数中使用inspace == 0,以及在后面的语句中使用inspace = 1时逻辑是如何工作的吗?
0是否表示输入中的空格?

iibxawm4

iibxawm41#

C的旧版本没有布尔数据类型“true”和“false”。
相反,他们只是使用整数,并决定0意味着“假”,其他任何东西意味着“真”。
考虑到这一点,上述代码的一部分可以读为:

if(c == ' ' || c == '\t' || c == '\n')
    {
      if(inspace == FALSE)
      {
        inspace = TRUE;
        putchar('\n');
      }
      /* else, don't print anything */
    }
    else
    {
      inspace = FALSE;
      putchar(c);
    }

从本质上讲,逻辑是这样的:

  • 如果下一个字符是非空白字符之后的第一个白色字符(inspace == FALSE),则打印一个换行符
  • 否则,如果下一个字符只是现有空白中的更多白色(inspace == TRUE),则忽略它
  • 否则打印
ckocjqey

ckocjqey2#

算法缺陷

虽然比较可能会有一些混乱,但存在算法缺陷。让我们首先处理这个问题。
循环前应使用inspace = 1;
在循环后添加if (!inspace) putchar('\n');

关于使用inspace等双态变量时的比较

  • 使用<stdbool.h>。它从1999年开始提供。
  • inspace编码为bool,而不是int
  • 把这两个东西放下。

不要编写类似abd == truedef == false的代码。不要创建TRUEFALSE

#include <stdbool.h>
#include <stdio.h>

int main(void) {
  int c;
  bool inspace = true;  // Note this is the opposite state of OP's code.

  while((c = getchar()) != EOF) {
    if(c == ' ' || c == '\t' || c == '\n') {
      if(!inspace) {
        inspace = true;
        putchar('\n');
      }
      /* else, don't print anything */
    }
    else {
      inspace = false;
      putchar(c);
    }
  }

  if (!inspace) {
    putchar('\n');
  }
  return 0;
}

其他改进

使用<ctype.h>

// if(c == ' ' || c == '\t' || c == '\n')
if (isspace(c))  // For all white-spaces, not just 3 of them.

相关问题