我用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);
}
为了编译它我用int main()替换main()。但我认为这与问题无关。该程序编译并运行正常。但它根本不计算字符,因为它是写的。我错过了什么吗?自从本书出版以来,现代编译器如何处理代码示例这样的事情会有所改变吗?非常感谢此留言板上的优秀人员提供的任何帮助。
最佳, 丹
答案 0 :(得分:7)
程序在读取“文件结束”后才输出字符数。使用交互式输入,您可以通过ctrl + d生成“文件结束”(至少在* NIX上,不知道窗口)。知道这一点,该程序在这里正常工作。
答案 1 :(得分: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;
}
}
}
文中尚未解释的唯一C元素是if
语句,实际上将在下一节(1.5.3)中进行说明。我希望这个小的替代例子可以帮助那些被K&amp; R书中的原始例子所吸引的人。一个好的“练习1.7b”将检查两个版本之间的差异并解释验证它们输出相同的结果(在阅读 Ctrl D / 之后)从其他答案中按Ctrl Z 。
答案 2 :(得分:5)
除了main的返回值外,它看起来还不错。
你是否在 Ctrl D (Unix)或 Ctrl Z (Windows)结束时输入如果从键盘输入值?
答案 3 :(得分:0)
值得注意的是,Ctrl + z(在控制台中显示为^ Z)不能简单地输入控制台输入中的任何位置;您必须输入它作为最后一行字符串/文本/字符的第一个输入。 E.G
Picture of initial input Ctrl + z
正如你在本例中所见,我输入了随机文本,每行结束后,我按下回车键。现在这是重要的!!!当您在最后一行按Enter键时,它将调用EOF(文件结束),您将使其余的代码按照最初的预期执行。
注意:
来源:EOF in Windows command prompt doesn't terminate input stream