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

K&;中示例1.5.2的问题;关于C的R书,c,kr-c,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); } #包

我在用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()
{
长nc;
nc=0;
while(getchar()!=EOF)
++数控;
printf(“%ld\n”,nc);
}
为了编译它,我将main()替换为int main()。但我认为这与问题无关。该程序编译和运行良好。但它并没有像编写时那样计算字符数。我错过什么了吗?自本书问世以来,现代编译器处理此类代码示例的方式是否会发生变化?非常感谢留言板上的好人能够提供的任何帮助

最好的,
Dan

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


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

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

尽管其他答案在技术上是正确的,但我觉得这个示例(1.5.2)和下面的示例(1.5.3)在教学上令人困惑。只要在谷歌上搜索“character counting 1.5.2”,你就会发现很多其他人都被这个例子所吸引,就像OP一样。之所以如此混乱,是因为文本中没有解释如何在交互模式下生成EOF字符,前面的示例在输入“return”后立即输出结果。因此,任何C初学者都会认为1.5.3中的程序也应该这样做

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

#包括
#定义下线'\n'
main()
{
长nc;
INTC;
nc=0;
而((c=getchar())!=EOF)
{
++数控;
如果(c==EOL)
{
/*打印输入字符数(不包括返回字符)*/
printf(“%ld\n”,nc-1);
nc=0;
}
}
}

文本中未解释的C的唯一元素是
if
语句,该语句将在下一节(1.5.3)中解释。我希望这个小的替代例子将有助于帮助那些被K&R书中最初的例子所吸引的人。一个好的“练习1.7b”是检查两个版本之间的差异,并解释和验证它们输出的结果是否相同(在阅读了其他答案中关于CtrlD/CtrlZ的内容后)。

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

正如您在本例中看到的,我输入了随机文本,在每行结束后,我按enter键。现在这很重要!!!当您在最后一行按enter键时,它将调用EOF(文件结尾),您将得到其余代码的执行,就像最初预期的那样

注:

  • 尽管Ctrl+z显示为^z,但无论按多少次,程序都不会将其计为字符
  • 此外,ctrl+z之后的字符也不计算在内
  • Enter由该程序计数

来源:

你给程序什么输入,打印什么?你给程序一个stdin文件吗?e、 g.程序<文件。给自己买第二版的K&R。第一版是博物馆的作品,比20年前的C89标准早了十年。(我有一本第一版的副本;我仍然珍视它。但它不是现在学习C语言的正确书籍。第二版是要使用的。)如果您以
ex-1.5.2
运行它,它将计算
somefile
中的字符。您还必须学习如何使用调试器。谢谢!这个例子正是我需要理解的!
#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;
        }
    }
}