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

Dan*_*Dan 5 c kr-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);
}
Run Code Online (Sandbox Code Playgroud)

为了编译它我用int main()替换main().但我认为这与问题无关.该程序编译并运行正常.但它根本不计算字符,因为它是写的.我错过了什么吗?自从本书出版以来,现代编译器如何处理代码示例这样的事情会有所改变吗?任何有关此留言板上的好人可能提供的帮助将不胜感激.

最好,丹

Uli*_*ter 7

程序在读取"文件结束"后才输出字符数.使用交互式输入,您可以通过ctrl + d生成"文件结束"(至少在*NIX上,不知道窗口).知道这一点,该程序在这里正常工作.


rob*_*ess 7

虽然其他答案在技术上是正确的,但我觉得这个例子(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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

文中尚未解释的唯一C元素是if语句,实际上在下一节(1.5.3)中对此进行了解释.我希望这个小的替代例子可以帮助那些被K&R书中的原始例子所吸引的人.一个良好的"锻炼1.7B"将是检查两个版本之间的差异,并解释验证它们输出相同的结果(阅读后CtrlD/ CtrlZ 从其他答案).


And*_*rsK 5

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

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