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

according documentation:

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

考虑strtol(str, (char**)NULL, 10); 如果str"0\0"如何知道函数是否失败或只是将字符串转换为"0"

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

 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 

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

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

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

您可以检查errno或为第二个参数传递非NULL值,并将其结果值与str进行比较,如:

 char * endptr; long result = strtol(str, &endptr, 10); if (endptr > str) { // Use result... }