【问题标题】:Problem with example 1.5.2 in K&R book on C关于 C 的 K&R 书中示例 1.5.2 的问题
【发布时间】:2010-09-05 13:47:14
【问题描述】:

我正在使用 K&R 自学 C 语言,并且被书中的一个示例难住了。我完全按照示例中编写的方式编译代码,但它并没有按照作者所说的那样进行。该程序应该计算字符。给出的代码如下:

#include <stdio.h>

/* count characters in input; 1st version */
main()
{
    long nc;
    nc=0;
    while (getchar() != EOF)
     ++nc;
    printf("%ld\n", nc);
}

为了编译,我将 main() 替换为 int main()。但我认为这与问题无关。该程序编译并运行良好。但它根本不计算字符,因为它是写的。我错过了什么吗?自从本书编写以来,现代编译器如何处理这样的代码示例是否会发生变化?非常感谢此留言板上的好人提供的任何帮助。

最好, 丹

【问题讨论】:

  • 你给程序什么输入,打印什么?
  • 你给程序一个标准输入文件吗?例如程序
  • 获得第二版 K&R。第一版是博物馆藏品,比已有 20 年历史的 C89 标准早了十年。 (我有一本第一版,我还是很看重它。但它不是现在学习 C 的正确书籍。第二版是可以使用的。)
  • 如果你以ex-1.5.2 &lt; somefile运行,它会统计somefile中的字符。
  • 您还必须学习如何使用调试器。

标签: c kr-c


【解决方案1】:

虽然其他答案在技术上是正确的,但我觉得这个例子 (1.5.2) 和下面的例子 (1.5.3) 在教学上令人困惑。只需谷歌“字符计数 1.5.2”,您就会发现许多其他人都被这个例子所吸引,就像 OP 一样。之所以如此混乱,是因为文中没有说明如何在交互模式下生成EOF字符,而前面的例子一输入“return”就输出了结果。因此,任何 C 初学者都会认为 1.5.3 中的程序应该做同样的事情......

我想提出以下替代代码,它会产生预期的结果:

#include <stdio.h>
#define     EOL '\n'

main()
{
    long nc;
    int c;
    nc = 0;

    while ((c = getchar()) != EOF)
    {
        ++nc;
        if (c == EOL)
        {
            /* Print number of input characters (not including return character) */
            printf("%ld\n", nc-1); 
            nc = 0;
        }
    }
}

文本中唯一没有解释的 C 元素是 if 语句,它实际上将在下一节 (1.5.3) 中解释。我希望这个小的替代示例能够帮助那些被 K&R 书中原始示例赶上的其他人。一个好的“练习 1.7b”将检查两个版本之间的差异并解释验证它们是否输出相同的结果(在阅读了关于 CtrlD / CtrlZ 来自其他答案)。

【讨论】:

  • 谢谢!这个例子正是我需要理解的!
【解决方案2】:

程序仅在读取“文件结尾”后输出字符数。通过交互式输入,您可以通过 ctrl+d 生成“文件结尾”(至少在 *NIX 上,不知道 windows)。知道了这一点,程序在这里就可以正常工作了。

【讨论】:

    【解决方案3】:

    除了 main 的返回值,它看起来还可以。

    您是在末尾执行 CtrlD (Unix) 还是 CtrlZ (Windows)如果您从键盘输入值,请输入?

    【讨论】:

      【解决方案4】:

      另外值得注意的是,Ctrl + z(在控制台中将显示为 ^Z)不能简单地在控制台输入中的任何位置输入;您必须将其作为最后一行字符串/文本/字符的第一个输入。 E.G

      Picture of initial input Ctrl + z

      正如你在这个例子中看到的,我输入了随机文本,在每一行结束后,我按下了回车键。现在这很重要!!!当您在最后一行按 Enter 时,它将调用 EOF(文件结尾),您将像最初打算发生的那样执行其余代码。

      Fully executed code

      注意:

      • 即使 Ctrl + z 显示为 ^Z,无论您按多少次,程序都不会将其视为一个字符。
      • ctrl+z 之后的字符也不计算在内。
      • 输入被此程序计数

      来源:EOF in Windows command prompt doesn't terminate input stream

      【讨论】:

        猜你喜欢
        • 2021-12-15
        • 2011-09-23
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        相关资源
        最近更新 更多