6

我正在用 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()。但我认为这与问题无关。该程序编译并运行良好。但它根本不计算字符,因为它是写的。我错过了什么吗?自从本书编写以来,现代编译器处理此类代码示例的方式是否发生了变化?此留言板上的好人可能能够提供的任何帮助将不胜感激。

最好的,丹

4

4 回答 4

10

尽管其他答案在技术上是正确的,但我觉得这个例子(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

于 2013-06-19T08:58:23.507 回答
7

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

于 2010-09-05T14:01:36.243 回答
5

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

如果您从键盘输入值,您会在输入结束时执行CtrlD(Unix) 还是(Windows)?CtrlZ

于 2010-09-05T14:00:39.030 回答
0

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

初始输入Ctrl+z的图片

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

完全执行的代码

笔记:

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

来源:Windows 命令提示符中的 EOF 不会终止输入流

于 2017-07-23T19:23:08.133 回答