atoi给出了alpha十进制字符串的错误结果

时间:2013-03-06 13:35:26

标签: c

我试图在以下字符串上调用atoi():“54”和“54df4”。虽然第一个输入给了我54的正确结果,但第二个字符串的调用也给了我54的结果。我假设该函数尽可能将字符串转换为十进制;相反,它根本不应该转换。 为什么会这样?以下是我的代码:

cout << "Wrong: " << atoi("54df4") << endl;

谢谢,勒凯什。

4 个答案:

答案 0 :(得分:4)

这就是atoi指定工作的方式。如果您不想转换包含非数字字符的字符串,则必须预先扫描该字符串,或使用strtol之类的函数,该函数可以返回第一个非数字字符的位置:

cons char *number = "54df4";
char *endp = NULL;

int value = strtol(number, &endp, 10);

if (endp != NULL && endp < (number + strlen(number)))
{
    printf("Stopped scanning in middle of string, it contains non-digit characters\n");
}

答案 1 :(得分:2)

来自documentation of atoi

  

该字符串可以包含其他字符后形成的字符   整数,被忽略并且对行为没有影响   这个功能。

答案 2 :(得分:1)

因为这是atoi的定义方式。以this手册页为例:

  

atoi()函数将nptr指向的字符串的初始部分转换为int

或者在C标准中:

  

C11(n1570),§7.22.1.2atoiatolatoll函数

     

atoiatolatoll函数将nptr指向的字符串的初始部分转换为intlong int和{{ 1}}表示,分别。

  • 如果您想对要转换的字符串执行更复杂的操作,请改用long long int(例如,请参阅this answer)。
  • 如果您不同意这些规格,请编写自己的功能!

答案 3 :(得分:1)

从下面有点随意找到atoi的手册....

http://linux.die.net/man/3/atoi

* atoi()函数将nptr指向的字符串的初始部分转换为int。 *

简而言之,该功能完全按照定义的方式工作。