使用printf()时为什么不产生任何输出?

时间:2013-05-02 10:20:11

标签: c

此刻我正在浏览K& RC,我正在尝试一个示例,其中程序将字符流作为输入,然后打印流中的字符数。

就我所见,这似乎没有产生任何输出:

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

任何指针都会非常感激。提前谢谢!

编辑

我尝试使用 ctrl z 来模拟EOF,但这似乎不起作用。我在Windows 7的cmd行上运行它,如果这有任何区别的话。 enter image description here

2 个答案:

答案 0 :(得分:4)

您的程序运行正常。

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

./a.out <myfile.txt

(这也适用于Windows)

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

然后应按预期工作。

➤ 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 working with minGW

答案 1 :(得分:2)

要让getchar返回EOF,您需要“关闭流/到达流的末尾”。查看此问题的答案:C : How to simulate an EOF?

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

e.g。在Linux下:

$ cat some_file.txt | ./a.out

希望这有帮助。

相关问题