atoi()返回奇怪的价值

时间:2015-07-09 21:28:51

标签: c strtok atoi

我从atoi命令中得到了一些非常奇怪的行为。我试图找到格式为[1:2]的范围内的2个值 正在创建的字符串是使用动态字符串分配宏完成的(如果Sasprintf抛出你) 但是,它将从项目结束时的文件中读入。 无论如何,考虑到tokentoken2的正确值,我似乎正在正确解析我的字符串。但是,我很困惑,为什么在atoi上拨打token2会给我一个胡言乱语的答案。另外,我发现在strtok被弃用的时候,我还没有打扰它,直到我解决了这个错误。

char *token;
char *token2;

int lsb = 0;
int msb = 0;    
char *str = NULL;

Sasprintf(str,"[4:0]");

token = strtok(str,"[");
if(token != NULL)
{
    token = strtok(token,":");
    msb = atoi(token);
    printf("%d\n", msb);
    token2 = strtok(NULL,"]");
    puts(token2);

    lsb = atoi(token2);
    printf("%d\n",token2);
}

输出

  

4

     

0

     

19853443

2 个答案:

答案 0 :(得分:2)

我想,你需要改变

  printf("%d\n",token2);

  printf("%d\n",lsb);

token2char *,您无法使用%d进行打印。调用undefined behavior

也就是说,总是检查strtok()的返回值是否为NULL。此外,strtod()atoi()的更好替代方案。

答案 1 :(得分:1)

    printf("%d\n",token2);

这不是你打印字符串的方式,使用:

    printf("%s\n",token2);

    printf("%d\n", lsb);

打印转换结果。