为什么getchar()函数在循环中会有所不同?

时间:2019-04-12 13:14:36

标签: c while-loop getchar putchar

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

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

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

1 个答案:

答案 0 :(得分:3)

  

为什么getchar()函数在循环中会有所不同?

我想问你一个问题,为什么Select * from favorite_user_cellphone uc where user_id = 234 and favorited_at is not null And cellphone_id not in ( Select cellphone_id from favorite_user_cellphone uc where user_id = 234 and unfavorited_at is not null) 的工作原理与您的预期不同 ,而不是与其他情况下的差异。如果您实际上是说后者,那么答案将是“不是”。

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

当然,您的循环确实反复调用它。循环控制表达式getchar()是在循环的每次迭代之前求值的,它涉及调用(c=getchar()) != EOF(与使用该函数先前返回的值相反)。


请注意,在完全不同的音符上,getchar()返回类型为getchar()的结果,恰好它可以返回至少一个值int,该值位于类型EOF的范围。如果将结果转换为类型unsigned char,则可能有一个实际输入值会误认为EOF,或者永远不会检测到EOF,具体取决于char是带符号的还是无符号的。为了可靠且可移植地检测文件的结尾,必须将返回值 处理为char,而不是int