如何确保strtol()已成功返回?

Jac*_*ack 10 c type-conversion

according documentation:

成功时,该函数将转换后的整数作为long int值返回.如果无法执行有效转换,则返回零值.如果正确的值超出可表示值的范围,则返回LONG_MAX或LONG_MIN,并将全局变量errno设置为ERANGE.

想想strtol(str, (char**)NULL, 10);如果str"0\0"如何知道函数失败或仅已转换与串"0"号?

Dan*_*her 12

如果要进行错误检查,则需要传递一个真实的指针地址,这样就可以区分"0"由0引起的0值和类似值"pqr":

char *endptr;
errno = 0;
long result = strtol(str, &endptr, 10);
if (endptr == str)
{
    // nothing parsed from the string, handle errors or exit
}
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE)
{
    // out of range, handle or exit
}
// all went fine, go on
Run Code Online (Sandbox Code Playgroud)

  • 为什么不只是`if (errno == ERANGE)`来检查失败? (3认同)

pau*_*sm4 5

恕我直言,我更喜欢sscanf()atoi()strtol()主要原因是您无法可靠地检查某些平台(即Windows)上的错误状态,除非您使用sscanf()(如果成功则返回10如果失败则返回)。

  • 您能否详细说明为什么 Daniel Fischer 的解决方案在 Windows 上不起作用?与 MSDN 文档相反,MSC 运行时“errno”实现**是**线程安全的,请参阅http://stackoverflow.com/questions/6413052/msvc-errno-thread-safety (2认同)

мал*_*ров 5

由于接受的答案实际上并不是检查失败的正确方法。

您不应通过检查 strtol 的返回值来检查错误,因为该字符串可能是 0l、LONG_MAX 或 LONG_MIN 的有效表示。相反,检查 tailptr 是否指向您期望的数字后(例如,如果字符串应在数字后结束,则为 '\0')。您还需要在调用之前清除 errno 并在调用之后检查它,以防出现溢出。