我正在使用turbo C++,我的程序没有产生输出

MW2*_*000 4 c

标题几乎说明了一切,所以这里是代码:

#include <stdio.h>

/* Program counts blanks, tabs, and newlines */
int main(void)
{
  int c;
  int b, t, nl;

  b = 0;
  t = 0;
  nl = 0;

  while ((c = getchar()) != EOF)
    if (c == ' ')
      ++b;
    if (c == '\t')
      ++t;
    if (c == '\n')
      ++nl;
  printf("Input has %d blanks, %d tabs, and %d newlines\n", b, t, nl);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用.它计算空白没有问题,但是当涉及到其余部分时,它们的值总是被打印为0.

不仅仅是"这里应该如何"的答案,我真的很喜欢"它不起作用,因为......你需要这样做,因为......"请回答.我正在努力掌握这些概念并实际理解语言,而不仅仅是知道哪些有效,哪些无效.

谢谢!你们已经帮助了吨:).

pax*_*blo 15

这是因为你缺少while循环的大括号.没有那些括号,唯一的内容while是第一个if陈述.这就是为什么它是只计算空白,因为你经历了整个文件这样做一个 if声明,然后,退出循环后,cEOF这样既不其他两个if语句将是真实的.

这是一个棘手的问题,很难看到因为缩进看起来应该可以工作但是,与Python不同,编译器不会使用缩进来弄清楚事情的位置:-)

如果你把一个左大括号while和一个右大括号放在后面printf,它应该计算一切.

换句话说,这是您的编译器所看到的:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
}
if (c == '\t')
    ++t;
if (c == '\n')
    ++nl;
Run Code Online (Sandbox Code Playgroud)

而你想要:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
    if (c == '\t')
        ++t;
    if (c == '\n')
        ++nl;
}
Run Code Online (Sandbox Code Playgroud)

  • +1.顺便说一句,这就是为什么人们应该总是使用牙箍,即使它们不是必要的,这样就不会发生这种情况(为什么K&R为什么允许无支撑变体呢?) (4认同)
  • 它总是支付费用,尤其是在第一次学习时 (3认同)