以下所有讨论都是在sizeof(int)和sizeof(long int)都等于4的基础上进行的.
int和long int二者的范围是一致的,都是-2^31---2^31-1,能表示的最大值是0x7FFFFFFF;
unsigned int和unsigned long int二者的范围也是一致的,都是0---2^32-1,能表示的最大值是0xFFFFFFFF;
假设一个输入字符串inputdata的合法值是0x0-0xFFFFFFFF,你需要检查输入数据的有效性,怎么办?
刚开始我用下面的这个方法:
int a;
a = atoi(inputdata);
if(a<0x0 || a>0xFFFFFFFF)
return BOOL_FALSE;
结果发现无论输入多大的值,检查都是成功的.后来追查原因,发现如果输入大于0x7FFFFFFF的值,a的值都是0x7FFFFFFF,当然不会超过0xFFFFFFFF了,没有达到检测的目的.
后来把a的定义改为unsigned int a,还是不行,原来atoi的函数原型是int atoi(const char *nptr);
再后来不用atoi了,改用sscanf,如下所示:
unsigned int a;
sscanf(inputdata, "%u", (unsigned int *)&a) ;
if(a<0x0 || a>0xFFFFFFFF)
return BOOL_FALSE;
可又有一个问题,如果输入超过0xFFFFFFFF的值,a的值都是0xFFFFFFFF,用a>0xFFFFFFFF来检查没有达到目的.如果用 a>=0xFFFFFFFF 来检查似乎达到目的了,不过如果用户恰好输入0xFFFFFFFF这个值程序会认为输入非法,而我又想允许用户输入0xFFFFFFFF这个值,怎么办呢?
无奈之下,只好用了long long: (c99支持long long)
long long a;
a = atoll(inputdata);
if(a<0x1 || a>0xFFFFFFFF)
return BOOL_FALSE;
唉,终于可以了.
阅读(1547) | 评论(0) | 转发(0) |