【问题标题】:usage difference between "atoi" and "strtol" in cc中“atoi”和“strtol”的用法区别
【发布时间】:2020-03-31 08:30:26
【问题描述】:

我从一年前就开始使用 atoi,最近几天我遇到了一个问题,即表达式 atoi("20") 给出的值是 0 作为输出。当我浏览谷歌时,我才知道它已被弃用,必须使用 strtol 。我知道的有趣的一点是 atoi 在内部使用 strtol。那么,改成strtol怎么解决这个问题呢?

【问题讨论】:

  • atoi sill 工作.. atoi("20") 应该返回20。问题出在您没有显示的 your 代码中。 Edit您的问题并显示minimal reproducible example。另请阅读:How to Ask
  • 请提供一个可重现的最小示例。 atoi() 函数可能已被弃用,但它仍然可以正常工作:example
  • @SaitejaPabisetti atoi 是否使用 strtol 的事实无关紧要。 atoidocumentation 所说的,不多也不少。错误在您的代码 中。可能atoi对你的使用太有限了,不看源码就不知道了。
  • atoi 已经使用了几十年。如果在您的程序中的某个时刻 atoi("20") 返回0,这只是证明程序中的任何地方您有未定义的行为。 C 是一种低级语言,UB 的后果在本地是不必要的。这就是为什么它被称为 Undefined Behaviour... 的原因
  • 我认为只要您提供相关代码,问题就会立即得到解决。我真的怀疑你的程序有 atoi("20") 里面有一个文字字符串。它更有可能是stoi(str),您认为str 应该是"20",但不要检查。您的评论“在第一次迭代中有效,在第二次迭代中无效”清楚地表明:问题出在您的代码中。

标签: c


【解决方案1】:

来自man页面的解释:

atoi() 函数将 nptr 指向的字符串的初始部分转换为 int。行为与以下相同:

strtol(nptr, NULL, 10);

除了 atoi() 不检测错误。 atol() 和 atoll() 函数的行为与 atoi() 相同,只是它们将字符串的初始部分转换为其返回类型 long 或 long long。

更多信息,您可以在本主题atoi - strtol查看两个功能的区别

【讨论】:

    【解决方案2】:

    根据数据,strtol() 具有更强大的功能

    int easy = atoi(data);
    // no errors detected
    

    char *err;
    errno = 0;
    long tmp = strtol(data, &err, 10);
    if (errno) /* deal with errno: overflow? */;
    if (tmp > INT_MAX) /* int overflow */;
    if (tmp < INT_MIN) /* int "underflow" */;
    if (*err) /* extra data */;
    int comprehensive = tmp; // convert from long
    

    【讨论】:

      【解决方案3】:

      除了 this answer 由 pmg 解释 strto... 如何具有更多功能和错误检查之外,标准还保证 ato... 函数的行为如下(C17 7.22.1.2):

      除了错误的行为,它们等价于

      atoi:  (int)strtol(nptr, (char **)NULL, 10)
      atol:  strtol(nptr, (char **)NULL, 10)
      atoll: strtoll(nptr, (char **)NULL, 10)
      

      话虽如此,ato... 不需要在内部调用 strto...(尽管在许多库中都是这种情况),只是为了在处理错误时表现相同。

      请注意,ato... 函数尚未正式列为过时。但是仍然应该避免它们,主要是因为在我们可以使用strtol(str, NULL, 10) 时使用atoi 是没有意义的,后者是相同的,但具有更好的错误处理能力。

      【讨论】:

        猜你喜欢
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多