我一直在试图正确地将一个字符数组转换为长整数strtol
,检查是否有上溢或下溢,然后对长整型进行转换。一路上,我发现有大量的代码看起来像这样为什么你不能检查errno是否等于ERANGE?
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE)
{
// Handle the error
}
为什么你不能只说
if(errno == ERANGE)
{
// Handle the error
}
从我的理解,如果发生溢或溢出,errno设置以两种情况下的ERANGE。前者是否真的有必要?单独检查ERANGE可能会产生问题吗?
这是我的代码看起来是截至目前
char *endPtr;
errno = 0;
long result = strtol(str, &endPtr, 10);
if(errno == ERANGE)
{
// Handle Error
}
else if(result > INT_MAX || result < INT_MIN)
{
// Handle Error
}
else if(endPtr == str || *endPtr != '\0')
{
// Handle Error
}
num = (int)result;
return num;
如果是前者,请让我知道一个道理。
通过您给我们的有限背景很难说清楚。 –
我从来没有见过一个很好的解释,为什么有必要检查'LONG_MAX/LONG_MIN'和'ERANGE'。除了手册页显示这一事实。我能想到的唯一明智的用例是区分溢出和下溢。我也有兴趣知道是否有其他原因。 – kaylum
@kaylum我不知道我觉得我的例子是正确的,主要是因为我不打算区分是否发生溢出或下溢,并且在两种情况下errno都设置为ERANGE。如果其中任何一个发生,比结果无效。 –