我一直在試圖正確地將一個字符數組轉換爲長整數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。如果其中任何一個發生,比結果無效。 –