說我有一個無效的整數輸入到一個char *其中,整數驗證爲int
char *ch = "23 45"
使用atoi(ch)
給出23
作爲轉換後的輸出,忽略了空間和45
我正在嘗試對此輸入進行測試。我能做些什麼來將其標記爲無效輸入?
說我有一個無效的整數輸入到一個char *其中,整數驗證爲int
char *ch = "23 45"
使用atoi(ch)
給出23
作爲轉換後的輸出,忽略了空間和45
我正在嘗試對此輸入進行測試。我能做些什麼來將其標記爲無效輸入?
在將字符串傳遞給atoi()
或使用strtol()
之前檢查該字符串,儘管後者將返回long int
。
隨着strtol()
,您可以檢查錯誤:
RETURN VALUE
The strtol() function returns the result of the conversion, unless the value would underflow or overflow. If an underflow occurs, strtol() returns LONG_MIN. If an overflow
occurs, strtol() returns LONG_MAX. In both cases, errno is set to ERANGE. Precisely the same holds for strtoll() (with LLONG_MIN and LLONG_MAX instead of LONG_MIN and
LONG_MAX).
ERRORS
EINVAL (not in C99) The given base contains an unsupported value.
ERANGE The resulting value was out of range.
The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).
缺乏錯誤檢測是的atoi()
功能的主要缺陷之一。如果這是你需要的,那麼基本的答案是「不要使用atoi()
」。
strtol()
函數幾乎在任何方面都是更好的選擇。爲了您的特定目的,您可以傳遞一個指向char *
的指針,其中它將記錄指向輸入中未轉換的第一個字符的指針。如果整個字符串轉換成功則指向字符串結束將被保存,所以你可以寫
_Bool is_valid_int(const char *to_test) {
// assumes to_test is not NULL
char *end;
long int result = strtol(to_test, &end, 10);
return (*to_test != '\0' && *end == '\0');
}
,我建議使用['strtol'](http://en.cppreference.com/w/c/string/byte/strtol),因爲它允許驗證。 –
https://stackoverflow.com/q/13199693/971127 – BLUEPIXY
scanf()及其朋友是邪惡的。我在這種情況下使用fgets(...)@BLUEPIXY – ekeith