0

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

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

谢谢,拉克什。

4

4 回答 4

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");
}
于 2013-03-06T13:41:53.920 回答
2

来自atoi 的文档

字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略并且不会影响此函数的行为。

于 2013-03-06T13:38:40.227 回答
1

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

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

或在 C 标准中:

C11 (n1570), § 7.22.1.2 atoiatolatoll函数

、和函数分别将 nptr 指向的字符串的初始部分转换为、atoi和表示。atolatollintlong intlong long int

  • 如果您想对要转换的字符串执行更复杂的操作,strtol请改用(例如,请参阅此答案)。
  • 如果您不同意这些规范,请编写您自己的函数!
于 2013-03-06T13:37:56.087 回答
1

从以下有点武断地找到atoi的手册页......

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

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

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

于 2013-03-06T13:38:57.443 回答