我一直在尝试使用
如果有前者的原因,请告诉我。
strtol
正确地将 char 数组转换为 long,检查是否存在溢出或下溢,并对 long 进行 int 强制转换。在此过程中,我注意到有很多代码看起来像这样。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
。除了手册将其作为示例显示之外。我能想到的唯一合理的用例是区分溢出和下溢。我也很想知道是否还有其他原因。 - kaylumerrno != 0 && result == 0
。虽然说实话,我不确定会发生什么情况,因为如果 strtol 返回0,那么我确信 strtol 没有将 errno 设置为任何值,假设它最初设为零的话。 - Luis Averhoffif(errno)
。 - chux - Reinstate Monica