为什么在这种情况下 return 0 不起作用?

Fak*_*Mod -2 c loops return infinite-loop while-loop

最近,我从开始学习C C程序设计语言布莱恩·柯林汉丹尼斯·里奇。在那本书中,有一个完整的小节(1.5.1,第 2 版),作者在其中创建了一个文件复制程序(但我将其用作文本(由用户输入)复制程序)。他们的代码基本上是这样的

#include <stdio.h>

int main()

{
    int c;
    c = getchar();

    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在运行时工作正常,但程序永远不会停止。该程序一直在等待输入并继续复制它们,无休止地,永不终止。现在我想创建一个程序,使这种无休止的复制终止。为此,我稍微调整了代码。这是我的代码

#include <stdio.h>

int main()

{
    int c;
    c = getchar();

    while (c != EOF) {
        putchar(c);
        c = getchar();
    }

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

我认为return 0;在最后明确写入可能会完成这项工作,但似乎输出根本没有改变。我还尝试使用 if-else 条件并按如下方式循环它们

#include <stdio.h>

int main()

{
    int c;
    c = getchar();

    while (1) {

        if (c != EOF){
            putchar(c);
            c = getchar();
        }

    else
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,程序也完全没有改变。

我的问题是如何更改代码,以便我的程序在复制一次后结束(或者,更好的是,将其概括为复制 n 次)?

在这里,澄清我所说的“一次”(或“n 次”)对我来说很重要。当我使用命令提示符(我使用 Windows)运行编译文件时,程序需要输入。我通过键盘输入输入,然后按下Enter以查看复制的输入。在此之后,程序再次希望我输入一些输入。我不希望这种情况发生。我希望程序在复制我的输入一次后自行结束。这就是我所说的“一次”(上面的定义也可以很容易地扩展为“n 次”)。


@anatolyg@Jabberwocky建议使用 \n(换行符)来使程序运行。但是当输入包含换行符时,此解决方案失败,例如

我的代码并
不会起作用,所以

我在
这里寻求帮助

将其作为输入复制到命令提示符中,并使用上述两个用户建议的程序仅my code does作为输出产生,这不是我想要的输出。有什么办法可以让这个程序为带有换行符的文本块工作,并让它在一次输入后停止(在这种情况下,整个文本块只是一个输入)?


在这里和其他人交流后,我开始意识到我对“一次输入”或“一次”的定义很模糊,不清楚,一点也不具体。因此,只能期望 C 不能做我想让它做的事情。我接受建议使用换行符作为终止程序的信号的答案,因为这与我的想法最接近。谢谢你们。

438*_*427 5

return 0不会有任何区别,因为执行将停留在while直到c变为 EOF。所以你需要使c等于EOF。根据操作系统尝试 ctrl-D 或 ctrl-Z。

我的问题是如何更改代码,以便我的程序在复制一次后结束(或者,更好的是,将其概括为复制 n 次)?

引入一个计数器,如:

#define MAX_INPUTS 10

...

int cnt = 1;
while (c != EOF && cnt < MAX_INPUTS) {
    putchar(c);
    c = getchar();
    ++cnt;
}
Run Code Online (Sandbox Code Playgroud)