繁体   English   中英

关于C的K&R书中的示例1.5.2的问题

[英]Problem with example 1.5.2 in K&R book on C

我正在用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()。 但我认为这与问题无关。 该程序可以编译并正常运行。 但是它根本不像编写的那样计算字符。 我想念什么吗? 自从本书编写以来,现代编译器如何处理这样的代码示例,这可能会有所改变吗? 非常感谢在此留言板上的好伙伴提供的任何帮助。

最好,丹

尽管其他答案在技术上都是正确的,但我认为此示例(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”将是检查两个版本之间的差异,并解释验证它们是否输出相同的结果(在从其他答案中了解到Ctrl D / Ctrl Z之后 )。

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

除了main的返回值外,它看起来还不错。

如果要通过键盘输入值,是否在输入末尾执行Ctrl D (Unix)或Ctrl Z (Windows)?

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

初始输入的图片Ctrl + z

在本例中可以看到,我输入了随机文本,每行结束后,按Enter键。 现在,这很重要!!! 当您在最后一行按Enter时,它将调用EOF(文件末尾),您将获得其余代码的执行,就像原来打算的那样。

完全执行的代码

注意:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM