关于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;
}
/**********************************************************/
这样将截断的操作放到后面,似乎就能完美地解决这个问题了。
- 关于getchar()函数
- 关于getchar函数
- 关于getchar()函数_1
- 关于getchar()函数
- 关于getchar函数的理解
- 关于getchar()函数的一个例子
- 关于函数库中函数getchar()
- 关于getchar函数缓冲区的问题
- 关于getchar函数缓冲区的问题
- 关于getchar()函数的一些看法
- 关于getchar()
- 关于getchar
- 关于getchar()
- 关于getchar()
- 关于getchar()
- getchar () 函数
- getchar函数
- getchar函数
- struts2+jquery之form插件实现异步上传图片并显示
- JS取屏幕显示高度技巧
- Linux 系统错误码及其说明
- WebKit shortcut
- weblogic问题汇总
- 关于getchar函数
- Entity Framework 学习总结之二:数据访问区别
- Download 163 video
- Nokia S40手机java代码实现后台
- 根据上排给出十个数,在其下排填出对应的十个数
- Libevent参考手册第一章:设置libevent(一)
- spring ibatis 整合 abator自动生成的xml文件报错及解决方法
- 数据库大型应用解决方案总结
- RTP 和 RTSP的区别