【问题标题】:Program not printing out numbers程序不打印数字
【发布时间】:2011-10-03 21:29:08
【问题描述】:

我是 C 的初学者,我买了《C 编程语言》这本书,开始阅读并做它所说的一切。书中有一个代码,应该打印出句子的行数、单词数和字符数。这是本书的代码。

#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */


/* count lines, words, and characters in input */
main()
{
 int c, nl, nw, nc, state;

 state = OUT;
 nl = nw = nc = 0;
 while ((c = getchar()) != EOF) {
      ++nc;
      if (c == '\n')
          ++nl; 
      if (c == ' ' || c == '\n' || c = '\t')
          state = OUT;
      else if (state == OUT) {
          state = IN;
          ++nw;
      }
 }
printf("%d %d %d\n", nl, nw, nc);
} 

由于某种原因,应该使用 printf 打印出来的值没有显示出来。我真的不知道出了什么问题。如果我将 printf 放在 while 循环中,它只会打印出数字,但这不可能是正确的,因为它会在每次值更改时打印数字。

【问题讨论】:

  • 我觉得没问题。如果您将其放入调试器并在您等待它到达的 printf 上放置一个断点会发生什么。是否有可能 printf 正在执行,然后在您实际看到输出之前关闭命令窗口?尝试在 printf 之后添加 getchar()。
  • 请注意,您写的是 c = '\t' 而不是 c == '\t'。
  • 那一定是书的错字。我还在 printf 之后放了一个 getchar() 但没有任何反应。
  • 比这更重要 (==):您使用的是哪个系统以及您是如何运行程序的?

标签: c


【解决方案1】:

您在这一行中有一个错字——c = '\t' 的赋值总是计算为 true

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

要修复,请将 = 更改为 ==

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

回答你的问题为什么它不打印任何东西 - 我认为编译器要么给你一个错误或警告导致程序没有被链接,因此你实际上并没有编译列出的源代码,但您正在运行您之前编译的任何代码的旧版本。

【讨论】:

  • 这正好说明了为什么我们中的许多人会写成:if (' ' ==c || '\n' == c || '\t' == c)——如果你不小心将比较错误地输入为赋值,你会得到一个编译器错误。当然,if (isspace(c)) 会更好。
  • 正确但更难阅读,因为这不是我们所说的方式。大多数编译器(例如现代版本的 gcc)都会对此给出警告。
  • 一开始我觉得有点刺耳,但几周后就消失了。就个人而言,我更喜欢总是适用于每个编译器的东西,而不是可能适用于某些编译器的某些版本,但即使使用它们也可以禁用的东西。
【解决方案2】:

gcc 在这一行给出编译错误:

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

看@那行,很容易发现一个错字:c = '\t')

缺少平等测试,不是吗? :)

【讨论】:

    【解决方案3】:

    看起来您正在从 STDIN(键盘)读取输入并仅在“文件结尾”处保留循环,这不会发生。按照其他答案的建议去做。

    【讨论】:

      【解决方案4】:

      除了其他人提到的错字之外,您还需要发送一个 End-Of-File 信号来结束输入循环。这将取决于您运行它的环境 - 在 Windows 中为 Ctrl+Z,在 *NIX 环境中应为 Ctrl+D。在使用我常用的 IDE(代码::块)时,我需要在新行中输入此内容,然后按 Enter。

      请记住,在编写 K&R (1 & 2) 时,命令行编程是常态,如果您刚刚结束程序,通常您会期望输出可见。某些 IDE 会在程序结束时关闭其终端仿真器,然后您才能查看结果,因此您可能需要添加类似

      printf("\nPress return to continue");
      getchar();
      

      在程序结束时。或者,您自己从操作系统终端模拟器运行它(在 Windows 上使用 cmd.exe,或者使用 gnome-terminal、yakuake 或您的操作系统提供的任何东西)。导航到文件夹并

      your_executable.exe
      

      ./your_executable
      

      【讨论】:

      • 如果您确实需要这样做,您实际上可能需要添加第二个 getchar(),因为流中可能仍有换行符
      【解决方案5】:

      这是上面if (c == ' ' || c == '\n' || c = '\t') 中指出的平等问题。 我建议您使用像 Eclipse CDT 这样的优秀 IDE,它会警告您此类错误。

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        相关资源
        最近更新 更多