关于getchar函数

来源:互联网 发布:淘宝怎么分享爱逛街 编辑:程序博客网 时间:2024/05/18 03:46

       我们可能对使用这个函数感到习以为常了,以至于可能会经常出现如下的代码:

     /**********************************************************/

       #include <stdio.h>

       int main(void)

       {

                char ch;

                while ( ( ch = getchar() ) != EOF )

                      putchar(ch);

                return 0;

       }

    /**********************************************************/

      咋一看觉得没有什么不妥,可是实际上这种写法是很危险的。原因在于程序中的变量ch被声明为char型而不是int型。这意味着ch可能无法容纳下所有可能的字符,特别是,可能无法容纳下EOF。因此,最后结果存在两种可能。一种可能是,某些合法的输入字符在被“截断”后使得ch的取值与EOF相同;另一种可能是,ch可能永远也取不到EOF的值。对于前一种情况,程序将在文件复制的中途中止;对于后一种情况,程序将陷入一个死循环。

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

       但是为了安全起见,我们显然不能够太相信编译器。因而,要实现更为安全的做法,那么我们尽管可以对程序做如下修改:

      /*********************************************************/

      #include <stdio.h>

       int main(void)

       {

                int ch;

                while ( ( ch = getchar() ) != EOF )

                      printf("%c",ch);

                return 0;

       }

    /**********************************************************/

      这样将截断的操作放到后面,似乎就能完美地解决这个问题了。