Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2278605
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2008-05-30 09:33:43

以下所有讨论都是在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;

唉,终于可以了.
阅读(1541) | 评论(0) | 转发(0) |
0

上一篇:字节对齐问题

下一篇:Linux路由表(转)

给主人留下些什么吧!~~