字符计数程序不能正常工作

时间:2016-08-22 14:51:01

标签: c

我使用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或根本不打印。我试过包括其他字符,如tab或backspace,但仍然没有。我正在使用ctrl + c来终止它。我做错了什么?

3 个答案:

答案 0 :(得分:0)

你的程序应该可以正常工作。尝试通过将文件重定向到它来运行它:

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;
}

答案 1 :(得分:0)

缓冲输入。

当您输入输入时,它会被终端缓冲(cmd.exe,xterm,等等)。此时您的程序仍未“看到”任何输入。只有在按Enter键后,终端才会将缓冲区内容发送到您的程序。

如果在按Enter键之前终止程序,则不会发送/处理任何内容。

答案 2 :(得分:0)

getchar()读到EOF;所以,你不会看到你的printf()输出,直到while循环退出(也就是说,当getchar()函数返回EOF时)。

要发送EOF,您可以按CTRL + D.尝试输入您的输入,然后点击CTRL + D,看看是否有效。至少在UNIX / OS X中,这将发送EOF。您还可以比较字符,如果按下某个键,则退出循环并查看计数。

如果您在另一个程序的输出中进行管道输送,那么这应该可以正常工作,因为它会在输出完成之后接收到EOF。例如,cat文件| ./counterprogram