为什么 getchar() 函数在循环中工作不同?

kha*_*led 0 c while-loop putchar getchar

#include <stdio.h>
int main()
{
    char c;

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

为什么当我输入诸如“omar”之类的文本时,将 char print“omar”放回去。它不应该重复打印“o”吗,因为 getchar 只会采用第一个字符。我知道我错了,可能是因为我不知道 getchar 或 putchar 到底是如何工作的,所以有人可以解释一下它们是如何工作的吗?另一个问题为什么 getchar 和 putchar 在没有 while 循环的情况下正常工作,但在 while 循环内行为有所不同。

Joh*_*ger 5

为什么 getchar() 函数在循环中工作不同?

我认为您是在问为什么getchar()工作原理与您预期的不同,而不是与其他环境中的不同。如果您实际上指的是后者,那么答案将是“不是”。

当然,从流中读取字符,无论是通过getchar()还是其他 I/O 函数,都会将其从流中删除。 getchar()如果不这样做的话,不会很有用。因此,如果您重复调用它,您将依次读取(并删除)每个字符,直到且除非所有可用字符都被消耗掉。您可以通过将程序中的循环替换为getchar()行中的多个调用来测试这一点。

当然,您的循环确实会重复调用它。循环控制表达式 ,(c=getchar()) != EOF在循环的每次迭代之前进行计算,这涉及调用getchar()(而不是使用该函数先前返回的值)。


另一方面,请注意getchar()返回 type 的结果int,以便它可以返回至少一个值,EOF该值超出了 type 的范围unsigned char。如果将结果转换为类型char,则要么有一个实际输入值被误认为 EOF,要么永远不会检测到 EOF,具体取决于是char有符号还是无符号。为了可靠且可移植地检测文件末尾,您必须将该返回值处理,而int不是char.