【问题标题】:atoi giving wrong result for alpha decimal stringsatoi 为 alpha 十进制字符串给出错误的结果
【发布时间】:2013-03-06 13:35:26
【问题描述】:

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

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

谢谢,拉克什。

【问题讨论】:

  • 是什么让您认为它的行为应该有所不同?
  • 谢谢大家的指点 - 我只是好奇为什么它被定义为部分工作。它不应该处理这样的混合字符串吗?

标签: c


【解决方案1】:

这就是指定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");
}

【讨论】:

    【解决方案2】:

    来自documentation of atoi

    字符串可以在构成 整数,被忽略且对行为没有影响 这个函数。

    【讨论】:

      【解决方案3】:

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

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

      或者在 C 标准中:

      C11 (n1570),§ 7.22.1.2 atoiatolatoll 函数

      atoiatolatoll 函数将 nptr 指向的字符串的初始部分分别转换为 intlong intlong long int 表示形式。

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

      【讨论】:

        【解决方案4】:

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

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

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

        简而言之,函数的工作方式与定义完全一致。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2017-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-15
          • 1970-01-01
          相关资源
          最近更新 更多