我正在阅读PrenticeHall。 The C Programming Language - 第二个Ed.Kernighan,Ritchie。
在本书(pg-20)中给出了一个程序示例,该程序应该打印用户在控制台窗口中键入的字符数,这是它的代码。
#include <stdio.h>
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}
但是当我运行它并在控制台中键入内容时,它根本不会打印任何内容,光标会一直闪烁。 这正是该书中编写代码的方式。
我也尝试过另一种方式,但这也没有用,与之前的代码相同。
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
如何使这件事有用?
P.S。 我正在使用Windows操作系统。 (静止)
答案 0 :(得分:6)
原因是代码尝试读取所有输入直到文件结尾。如果这个程序是从一个文件中读取的,它会知道它什么时候结束,但是因为它从控制台读取,你必须明确告诉它输入结束了。在Linux上,您可以在Windows ^D
上按^Z
(Ctrl + D)(Ctrl + Z)来执行此操作。
请注意,必须在新行的开头处完成,即在按下Enter
后,按^D
(在Win上^Z
)。
我正在阅读PrenticeHall。 Ansi C编程语言 - 第2版 Ed.Kernighan,里奇。
这是一本非常好的书,你正在阅读。这很好,我想,它包含了你问题的答案。
答案 1 :(得分:5)
您的两个程序都有效,您只需输入EOF
,就像我在您问题下面的第一条评论中指出的那样。那是Linux下的^D
(Control-D)和Windows下的^Z
(Control-Z)。
请注意循环中的两个条件都在寻找EOF
not或其他一些要终止的输入。提供此输入后,循环将终止,并显示您的计数。
答案 2 :(得分:3)
您应该停止输入录制`EOF'字符(GNU / Linux上的Ctrl + D)。
答案 3 :(得分:2)
我的编译器(GCC 4.4)对您发布的代码进行了狡辩。这消除了狡辩:
#include <stdio.h>
int main()
{
int nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%d\n", nc);
return 0;
}
但其他答案是正确的:您必须使用Ctrl-D或-Z结束键盘输入。
我不确定为什么Kernighan和Ritchie在这种情况下使用了double
。