字符计数程序不工作,因为它应该
问题描述:
我使用Dev-C++ 5.11在我的Windows XP PC中创建了一个C程序。这是我看到了作为一个典型的字符计数程序中的一个,它去如下:字符计数程序不工作,因为它应该
#include <stdio.h>
main() {
long nc;
nc = 0;
while (getchar() != EOF) {
++nc;
}
printf("%ld", nc);
}
它编译没有问题,但它的作品,因为它应该的人物中,只有当我按我包括回车键(\n
) 。如果我不打印它或者打印0或者什么也不打印。我尝试过包含其他字符,如制表符或退格键,但什么也没有。我正在使用Ctrl + C来终止它。我究竟做错了什么?
答
缓冲的输入。
当你输入输入时,它会被终端缓存(cmd.exe,xterm,whatever)。在这一点上,你的程序仍然没有“看到”任何输入。只有在您按下回车键后,终端才会将缓冲区内容发送到您的程序。
如果您在按Enter之前终止程序,则无法发送/处理任何内容。
答
你的程序应该可以正常工作。尝试通过将文件重定向到它来运行它:
myprogram < somefile
您观察到的问题来自终端处理文件结尾。您可以在Windows中输入Ctrl-Z<enter>
,在Unix中输入Ctrl-D
来表示文件的结尾。
不过请注意,你应该写你的程序是这样的:
#include <stdio.h>
int main(void) {
long nc;
nc = 0;
while (getchar() != EOF) {
++nc;
}
printf("%ld\n", nc);
return 0;
}
答
getchar()直到EOF;因此,直到while循环退出(即,当getchar()函数返回EOF)时,您将看不到您的printf()输出。
为了发送EOF,您可以按CTRL + D。尝试输入你的输入,然后按CTRL + D,看看是否有效。至少在UNIX/OS X中,这将发送EOF。您还可以比较字符,如果按下某个键,则退出循环并查看您的计数。
如果你正在从另一个程序输出管道,那么这应该可以正常工作,因为输出完成管道输入后它会收到EOF。例如,cat file | ./counterprogram
[while((c = getchar())!= EOF)不可能重复](http://*.com/questions/18565663/while-c-getchar-eof-not-terminating ) –
也许它不工作,“它应该”,但它的工作原理,因为你正在使用getchar()函数,它等待“输入按钮” –
@DarkoDjuric:'getchar()'不等待“输入”,它等待输入实际出现在'stdin'处。两者是完全不同的东西。 – DevSolar