返回整数的getchar函数

来源:互联网 发布:ios助手for mac 编辑:程序博客网 时间:2024/05/01 21:49

来自:C缺陷与陷阱5.1

我们首先看下面的这个例子:

#include <stdio.h>

int main()

{

char c;    /* 改成:int c就正确了 */

 

    while( ( c = getchar() ) != EOF )

    {

        putchar( c );

    }

 

    return 0;

}

getchar函数在一般情况下返回的是标准输入文件中的下一个字符,当没有输入时返回EOF(一个在头文件stdio.h中被定义的值,不同于任何一个字符)。这个程序乍一看似乎把标准输入复制到标准输出,实则不然。

 

原因在于程序中的变量c被声明为char类型,而不是int类型。这意味着c无法容下所有可能的字符,特别是,可能无法容下EOF。因此,最终结果存在以下几种可能:

1、某些合法的输入在被截断后,使得c的取值和EOF相同;这时程序将在文件复制的中途终止;

2c根本不可能取到EOF这个值;这时程序陷入死循环;

3、程序表面上似乎能够正常工作,但完全是因为巧合。尽管函数getchar的返回结果在赋值给char类型的变量c时会发生“截断”操作,尽管while语句中比较运算的操作数不是函数getchar的返回值,然而令人惊讶地是许多编译器对上述表达式的实现并不正确。这些编译器确实对函数getchar的返回值做了截断处理,并把低端直接部分赋给了变量c。但是,它们在比较表达式中并不是比较cEOF,而是比较getchar函数的返回值与EOF,编译器如果采取这种做法,上面的例子程序看上去就能够“正常”运行了。

0 0
原创粉丝点击