【发布时间】:2021-02-08 11:19:06
【问题描述】:
我最近开始向 Brian Kernighan 和 Dennis Ritchie 的 The C Programming Language 学习 C。在那本书中,有一个完整的小节(1.5.1,第 2 版),作者在其中创建了一个文件复制程序(但我将其用作文本(用户输入)复制程序)。他们的代码基本上是这样的
#include <stdio.h>
int main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
这段代码在运行时运行良好,但程序永远不会停止。程序继续等待输入并继续复制它们,无休止地,永不终止。现在我想创建一个程序,这个无休止的复制确实会终止。为此,我稍微调整了代码。这是我的代码
#include <stdio.h>
int main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
return 0;
}
我认为在最后明确写 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;
}
}
但在这种情况下,程序也完全没有改变。
我的问题是如何更改代码,以便我的程序在复制一次后结束(或者,更好的是,将其概括为复制 n 次)?
在这里,我必须澄清“一次”(或“n 次”)的含义。当我使用命令提示符(我使用 Windows)运行编译文件时,程序需要输入。我通过键盘输入输入,然后按 Enter 以查看复制的输入。在此之后,程序再次希望我输入一些输入。我不希望这种情况发生。我希望程序在复制我的输入一次后自行结束。这就是我所说的“一次”(上面的定义也可以很容易地扩展到“n 次”)。
@anatolyg 和 @Jabberwocky 建议使用 \n(换行符)来使程序运行。但是当输入包含换行符时,此解决方案会失败,例如
我的代码可以
不是这样的
我在问
在这里寻求帮助
将其复制到命令提示符中作为输入,并使用上述两个用户建议的程序仅产生my code does 作为输出,这不是我想要的输出。有什么办法可以让这个程序适用于带有换行符的文本块,并且在一次输入后停止(在这种情况下,整个文本块只是一个输入)?
在与这里的其他人互动后,我开始意识到我对“一次输入”或“一次”的定义非常模糊、不清楚,而且一点也不具体。因此,无非是期望 C 不能做我想做的事。我接受了建议使用换行符作为终止程序的信号的答案,因为这与我的想法最接近。谢谢大家。
【问题讨论】:
-
你是如何输入“EOF”的?
-
看起来“只复制一次”对你来说很重要,而且你对“一次”有一些特殊的定义。通常,“读取文件一次”意味着在文件末尾停止,这正是您的程序所做的。请澄清“一次”对您意味着什么。你可以edit你的帖子解释一下。
-
@FakeMod 你认为程序如何知道它应该何时结束?完全不清楚你想要什么。
-
问题是计算机不知道“第一次输入”是什么意思。似乎您已将其定义为“从剪贴板进行一次粘贴操作”(ctrl-z),但程序无法知道文本是来自剪贴板还是来自键盘,因此您不能拥有那种功能。
-
@FakeMod 同样,您应该能够阅读 EOF 几次 次。点击 EOF 后,您将使用clearerr 清除 EOF 和错误指示器s,然后您可以再次循环。此外,一些“粘贴检测”代码是可能的 - 如果您快速连续获得几行代码,那么用户肯定没有粘贴它们,因为即使是最快的打字员也可能不会每秒写一行。
标签: c loops while-loop return infinite-loop