0

我现在正在使用 K&R C,我正在尝试一个示例,其中程序将字符流作为输入,然后打印流中的字符数。

据我所知,这似乎没有产生任何输出:

main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF){
         ++nc;
    }
    printf("%1d\n", nc);
}

然而,这似乎工作正常,虽然与我想要的略有不同:

main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF){
         ++nc;
         printf("%1d\n", nc);
    }
}

任何指针将不胜感激。提前致谢!

编辑

我尝试过使用模拟 EOF,ctrlz但这似乎不起作用。如果这有什么不同,我会在 Windows 7 的 cmd 行之外运行它。 在此处输入图像描述

4

2 回答 2

4

您的程序运行良好。

您没有看到输出,因为您从不发送EOF. 如果您在命令行上运行,请传入一个文件:

./a.out <myfile.txt

(这也适用于 Windows)

或者,如果您自己输入输入内容,请输入<return><ctrl-D><return>以发送EOF. (或<return><ctrl-Z><return>在 Windows 上)

这应该可以按预期工作。

➤ cat try.c
#include <stdio.h>
main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF){
         ++nc;
    }
    printf("%1d\n", nc);
}
➤ gcc try.c -o try && ./try <try.c
131

这是一个使用 GnuCC 的示例会话。

control-Z 与 minGW 一起工作

于 2013-05-02T10:26:50.067 回答
2

getchar返回EOF,您需要“关闭流/到达流的末尾”。请参阅此问题的答案:C:如何模拟 EOF?

简而言之:您需要将 EOF 发送到流(例如,通过在 Windows 上发送 Ctrl+Z 或在 Linux 上发送 Ctrl+D)。或者例如使用管道。例如,将一个文件的内容通过管道传输到您的应用程序。当第一个应用程序终止时,它会自动关闭流,因此您的应用程序将读取 EOF。

例如在 Linux 下:

$ cat some_file.txt | ./a.out

希望这可以帮助。

于 2013-05-02T10:29:28.103 回答