【发布时间】:2012-12-20 00:17:15
【问题描述】:
下面的程序将字符串转换为长字符串,但根据我的理解,它也返回错误。我依赖的事实是,如果strtol 成功将字符串转换为长字符串,那么strtol 的第二个参数应该等于NULL。当我使用 55 运行以下应用程序时,我收到以下消息。
./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
如何成功检测 strtol 中的错误?在我的应用程序中,零是一个有效值。
代码:
#include <stdio.h>
#include <stdlib.h>
static long parseLong(const char * str);
int main(int argc, char ** argv)
{
printf("%s as long is %ld\n", argv[1], parseLong(argv[1]));
return 0;
}
static long parseLong(const char * str)
{
long _val = 0;
char * temp;
_val = strtol(str, &temp, 0);
if(temp != '\0')
printf("Could not convert %s to long and leftover string is: %s", str, temp);
return _val;
}
【问题讨论】:
-
再次阅读文档;您还应该处理溢出等错误。
-
另外,
strto*函数的正确错误检查不是通过检查输出指针来完成的。应该通过检查零返回值和一组errno来完成。 -
为什么不在 C++ 中使用
std::stoi? (你添加了 C++ 标签) -
@BatchyX,对于像“123abc”这样的字符串(就像my previous question 中的共识一样),它不会很好地工作。 OP 正在检查要转换的整个字符串。
-
@chris:你可以用
std::stoi做同样的事情。其实stoi的原型和strtol差不多,只是使用了异常到期的异常,而不是带有全局错误变量hackery的错误返回值。