首页 > 解决方案 > 为什么 getchar() 函数在循环中的工作方式不同?

问题描述

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

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

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

标签: cwhile-loopgetcharputchar

解决方案


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

我带你问为什么getchar()工作方式与你预期的不同,而不是在其他情况下不同。如果您实际上是指后者,那么答案将是“不是”。

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

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


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


推荐阅读