c语言中getchar()函数一个常见Error

getchar() 从这个名字来看应该是 得到一个字符。 正好C语言里面有一个char类型, 很容易就出现了如下程序:

# include <stdio.h>

int main (void)
{
    char c;
    while((c = getchar()) != EOF)
    {
        putchar(c);
    }
    return 0;
}

主要谈一下下面这条语句:

while((c = getchar()) != EOF)
首先 getchar函数的原型是:int getchar(void); 上面这条while语句的意思是:如果标准输入文件中输入的不是EOF,那么执行循环体。 getchar函数返回值是一个int型,但是上面我们使用了char型来接, 这就意味着c可能不能容下所有可能的字符,可能无法容下EOF。

因此最终结果存在两种可能:一种是某些合法的字符被“截断”之后的值与EOF相同, 这种情况导致的结果就是复制可能会提前停止。 第二种情况是可能无法取到EOF,即死循环。

其实还有一种情况:这个程序能顺利运行是因为巧合。why?

好好解释一下这条语句, 按照我的理解应该是:将getchar函数的返回值放在c的内存空间里面,如果内存不够,就“截断”。然后将c和EOF作比较。 如果c不是EOF,那么成立。 但是许多编译器并不是这么实现的。 这些编译器确实对getchar的返回值做了“截断”处理,但是与EOF比较的不是c,而是getchar函数的返回值。具体怎么实现的我也不知道,可能是用一个变量来记录getchar的返回值,然后与EOF比较;也可能是其他的。 如果我们使用的编译器是上面这种,那么结果就和我们最初的预想相同了。但是如果不是这样呢?  所以说这个一个巧合。 我们用的时候应该使用int型变量来“装”getchar的返回值。

------------------

文章内容来自于:《c 陷阱与缺陷》 第5.1章   P84

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/78875897