博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
while((c= getchar()) != EOF)的隐藏问题
阅读量:4111 次
发布时间:2019-05-25

本文共 847 字,大约阅读时间需要 2 分钟。

while((c= getchar()) != EOF)的隐藏问题

曾今写过这样的代码:
char c;while((c= getchar()) != EOF){ 	Do……}
用以读取文本中的数据,曾一直以为这段代码应该是正确的,从语法到逻辑上看起来它都应该是正确的,但其实不然,因为这尽在逻辑层面是正确的,但结合底层实现来思考,它是存在问题的,而且问题很大。
先分析库函数getchar(),该函数会返回int值,而EOF在大多数实现中都是一个特殊值-1(EOF表示的是getchar()返回的超出范围的特殊值,是与getchar()可能返回的所有字符都不同的特殊值)。在这里有一点需要注意,符号、值,这两者本质上有什么不同么?都是用0和1表示的二进制数据而已。getchar()返回的数据或者说值,在什么情况下才能不失真的保存下来?当然是要保存在一个char型及以上的变量中,才能不失真。
那么问题到底存在哪里呢?接下来我们具体讲述,依据C语言标准我们知道,数据类型的具体大小决定于实现,假定某一实现下char型为有符号型,占用8 bit 存储空间,那么便能表示255个不同的值,该环境中EOF标志位常见的定义-1。那么十进制255对应的字符’\377’或’\XFF’在解释的时候就会被扩展为与EOF相等的值,而造成错误,使得该段代码被错误的提前结束。如果某一实现下char型为无符号型,EOF会被截断而失去最高位,无法被识别为与EOF相等的值,会导致该段代码陷入死循环。
这段代码的问题就是getchar()返回的字符究竟是多少个bit所表示的,如果在某一实现中char为8 bit,getchar()返回的字符在7 bit表示以内则不会出现任何问题,如果返回的是一个8 bit表示的字符,则问题就会显现出来,这种错误和底层实现息息相关,在没有了解底层实现的情况下,逻辑层面、代码层面根本不能发现这一问题。或者在某一环境、平台下正常运行,但一旦移植到其他环境就存在隐患,而且难以被发觉。

转载地址:http://mmmsi.baihongyu.com/

你可能感兴趣的文章
UVA 11275 判断空间三角形是否相交
查看>>
Find a way bfs搜索 容易出错
查看>>
C - Charm Bracelet dp
查看>>
CF 551B 暴力+字符串
查看>>
CF 551c 二分搜索+思维题
查看>>
UVA 10054
查看>>
cf 550A 字符串统计
查看>>
CF 字符串+数论
查看>>
POJ 1274 The Perfect Stall 二分匹配模板
查看>>
CF Mike and Fax 字符串组成
查看>>
POJ 3250 单调栈模板
查看>>
CF #338B Longtail Hedgehog 画刺猬
查看>>
Good Bye 2015 B. 位运算
查看>>
Cf #179 (Div. 1) B. Greg and Graph 活用三重floyd
查看>>
CF #165 DIV2 E 最大流的流向
查看>>
Manthan 2011 A. Partial Teacher 拓扑排序or直接数组处理
查看>>
AVL树与红黑树比较
查看>>
排序算法比较与分析
查看>>
似然函数 极大似然估计
查看>>
逻辑回归
查看>>