2017-05-30 59 views
-1

說我有一個無效的整數輸入到一個char *其中,整數驗證爲int

char *ch = "23 45" 

使用atoi(ch)給出23作爲轉換後的輸出,忽略了空間和45

我正在嘗試對此輸入進行測試。我能做些什麼來將其標記爲無效輸入?

+2

,我建議使用['strtol'](http://en.cppreference.com/w/c/string/byte/strtol),因爲它允許驗證。 –

+1

https://stackoverflow.com/q/13199693/971127 – BLUEPIXY

+0

scanf()及其朋友是邪惡的。我在這種情況下使用fgets(...)@BLUEPIXY – ekeith

回答

3

在將字符串傳遞給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). 
+2

同樣重要的是返回值是中間參數,因爲它允許檢查它是否轉換整個字符串。 –

+0

如何使用atoi()來指示輸入是否可用 – ekeith

+0

只需循環它並檢查它是否僅包含數字(如果您接受負數整數,也許'-'作爲第一個符號)。 – syntagma

2

缺乏錯誤檢測是的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'); 
}