字符计数程序不工作,因为它应该

问题描述:

我使用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来终止它。我究竟做错了什么?

+2

[while((c = getchar())!= EOF)不可能重复](http://*.com/questions/18565663/while-c-getchar-eof-not-terminating ) –

+1

也许它不工作,“它应该”,但它的工作原理,因为你正在使用getchar()函数,它等待“输入按钮” –

+0

@DarkoDjuric:'getchar()'不等待“输入”,它等待输入实际出现在'stdin'处。两者是完全不同的东西。 – DevSolar

缓冲的输入。

当你输入输入时,它会被终端缓存(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