Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6901
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-11 18:10
文章分类
文章存档

2015年(5)

我的朋友

分类: C/C++

2015-07-25 19:10:49

原文地址:atoi()的问题 作者:CUDev

在写程序的时候,我们经常使用到atoi()这个函数将命令行参数转化为数字。

今天在写程序的时候,使用命令行参数传递数据包的seq来构造数据包,发现构造的总不是自己输入的数。考虑可能是atoi()的问题,在程序里面打印atoi()之后的结果,发现果然不对。

仔细查了一下,atoi()转化成一个signed int,是有符号的,范围是-2G~+2G。如果我们输入的是一个大于2G的数的话,就会有问题。

       The call atoi(str) shall be equivalent to:

              (int) strtol(str, (char **)NULL, 10)

       except  that  the handling of errors may differ. If the value cannot be
       represented, the behavior is undefined.

atoi()是使用strtol()来实现的。

有strto*这么一族函数,以前没有怎么用过,看一下:
wangyao@wangyao-desktop:~/Public$ man strto
strtod     strtoimax  strtok_r   strtold    strtoul    strtoumax 
strtof     strtok     strtol     strtoll    strtoull 

我们使用strtoul()来实现一个atou()。

unsigned int atou(char *str)
{
    return strtoul(str,NULL,10);
}

我写了一个程序测试一下:
#include
#include

unsigned int atou(char *str)
{
        return strtoul(str, NULL, 10);
}

int main(int argc, char *argv[])
{
        printf("argv[1]: %s\n", argv[1]);
        printf("atoi: %u\n", atoi(argv[1]));
        printf("atou: %u\n", atou(argv[1]));

        return 0;
}


结果如下:
wangyao@wangyao-desktop:~$ ./a.out 2430046651
argv[1]: 2430046651
atoi: 2147483647
atou: 2430046651

阅读(1353) | 评论(0) | 转发(0) |
0

上一篇:加入一个多播组(最简单的情况)

下一篇:没有了

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