首页 >后端开发 >C++ >在C和C中使用strtol时如何正确处理错误?

在C和C中使用strtol时如何正确处理错误?

Barbara Streisand
Barbara Streisand原创
2024-12-25 15:35:09872浏览

How Can I Properly Handle Errors When Using strtol in C and C  ?

正确使用 strtol 进行错误处理

以下 C 或 C 程序将字符串转换为长整数,依赖于 strtol 返回的事实NULL 表示成功转换。但是,当给定值 55 时,它会失败并显示以下消息:

./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55

本文探讨了如何正确检测 strtol 中的错误并解决给定程序中的问题。

strtol 中的错误处理

strtol(以及 strtoll 等相关函数)的官方规范指出即:

  • 它将输入字符串分成三部分:空格、主题(整数)和无法识别的字符。
  • 如果主题为空或无效,则不会发生转换,并且endptr 指向输入字符串的开头。
  • 如果转换后的值超出可表示范围,则返回适当的最小值或最大值(例如,LONG_MIN 或 LONG_MAX),并且 errno 设置为 ERANGE。

更正程序

在 C 中,可以通过设置来检测来自 strtol 的错误在调用该函数之前将 errno 设置为零。下面修改后的 parseLong 函数遵循以下方法:

static long parseLong(const char *str)
{
    errno = 0;
    char *temp;
    long val = strtol(str, &temp, 0);

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &amp;temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE))
        rc = false;

    return rc;
}
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • 如果输入为空、无效或有尾随字符,则会向 stderr 打印错误,如果错误则返回 0 或 LONG_MIN/LONG_MAX由于范围溢出。
  • 如果没有错误,则返回转换后的

在 C 中,更灵活的方法是返回成功/失败指示符,并提供一个单独的函数来提取转换后的值:

结论

通过这些修改,parseLong 函数可以正确处理来自 strtol 的错误,从而允许应用程序确定成功或转换失败并适当处理错误。

以上是在C和C中使用strtol时如何正确处理错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn