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

时间:2010-07-22 02:06:28

标签: 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;
}

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

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

谢谢!你们已经帮助了很多人:)。

2 个答案:

答案 0 :(得分: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;

而你想要:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
    if (c == '\t')
        ++t;
    if (c == '\n')
        ++nl;
}

答案 1 :(得分:0)

我在这里看到很多“总是需要大括号”。这很好,它会阻止这种情况发生,但我倾向于总是使用一个好的编辑器。例如,Emacs会自动缩进C代码,使这种事情变得非常明显。您的第2和第3个if语句不会缩进。

另一种选择,如果您不喜欢大括号,则使用else if来使用if。不要这样做,但要明白它。