首页 >后端开发 >C++ >在 C 中使用 strtol 将字符串转换为长整数时如何可靠地检测错误?

在 C 中使用 strtol 将字符串转换为长整数时如何可靠地检测错误?

Linda Hamilton
Linda Hamilton原创
2024-12-14 20:36:16558浏览

How Can I Reliably Detect Errors When Converting Strings to Long Integers Using strtol in C?

使用 strtol 检测字符串到长整型转换中的错误

在 C 编程中,strtol 函数通常用于转换 a 的字符串表示形式长整数为其数值。然而,单独使用 strtol 可能并不总能提供足够的错误处理。

问题:

提供的代码演示了程序正确将字符串转换为长整数的场景,但也会打印一条错误消息,指出“尽管转换成功,但无法转换”。这是因为程序假设如果 strtol 成功转换字符串,则第二个参数(表示剩余字符串)应该为 NULL。但是,即使转换成功,某些条件也可能导致出现非 NULL 剩余字符串。

解决方案:

要准确检测 strtol 中的错误,请考虑以下改进:

  1. 使用专用函数调用 strtol: 这可以改善代码组织和可读性。
  2. 检查多个错误条件: strtol 错误处理很复杂。除了剩余内容之外,您还应该检查无效的数字字符串、数字溢出和前导/尾随空格。
  3. 在调用 strtol 之前将 errno 显式设置为 0: 这可确保 errno 正确设置以指示遇到的任何错误。
  4. 检查特定错误值:如果出现错误,检查与 ERANGE 关联的 errno 值(数字溢出)。

修订的函数:

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

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">if (parseLong(str, &value))
    // Conversion successful
else
    // Handle error
' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)) rc = false; return rc; }

用法:

这个修改后的函数返回一个布尔值来指示转换是否成功或 不是。您可以按如下方式使用它:

附加说明:

  • 您可以进一步自定义该函数来处理空白修剪或限制转换为仅十进制值。
  • 在某些情况下,您可能需要更精细的错误报告机制,例如返回错误代码或抛出错误例外。

以上是在 C 中使用 strtol 将字符串转换为长整数时如何可靠地检测错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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