2011-10-16 157 views
4

有人可以解釋爲什麼的atoi功能不nuber誰擁有超過9個位數的工作。
例如:的atoi功能不能正常工作

我輸入123456789,程序顯示123456789,但是當我輸入12345678901程序時說-519403114 ...感謝您的幫助。

int main() 
{ 
    int i; 
    char szinput [256]; 
    printf ("Enter a Card Number:"); 
    fgets(szinput,256,stdin); 
    i=atoi(szinput); 
    printf("%d\n",i); 
    getch(); 
    return 0; 
} 
+3

的atoi爲整數。當你需要比MAXINT更大的整數時,使用atol。 –

+1

'atoi'用於'int',而不是「整數」。 「int」和「long」都是整數類型。 –

+0

在大多數系統中,'int'和'long'的大小相同,因此您可能需要一個適用於較大類型的函數。 –

回答

9

如果您關心錯誤處理,請勿使用atoi()或任何atoi*()函數。這些功能無法檢測錯誤;既沒有atoi(99999999999999999999)也沒有atoi("foo")有任何方式告訴你,有一個問題。 (我認爲這些案例中的一個或兩個實際上有未定義的行爲,但我必須檢查確定。)

strto*()功能有點棘手,但它們可以可靠地告訴你一個字符串代表一個有效的數字,無論是在範圍內,還是其價值。 (你必須處理errno得到充分的檢查。)

如果你只是想要一個int值,你可以使用strtol()(其中,錯誤檢查後,給你一個long結果),它後也轉換爲int檢查的結果是在int的描述範圍(參見<limits.h>INT_MININT_MAX)。 strtoul()給你一個unsigned long的結果。分別爲strtoll()strtoull()分別爲long longunsigned long long;它們在C99中是新的,而 編譯器 實現可能不支持它們(儘管大多數非Microsoft實現可能會這樣做)。

6

因爲您溢出的int具有如此大的值。

此外,atoi已被棄用,並且在很多平臺上線程不安全,因此您最好棄用它以支持strto(l|ll|ul|ull)

考慮使用strtoull代替。由於unsigned long long是大多數現代平臺上的64位類型,因此您可以將其轉換爲與2^6418446744073709551616)一樣大的數字。

要打印unsigned long long,使用%llu格式說明。

+2

'strtoull()'不會處理負數,並且可能在所有實現中都不可用。對於int值,'strtol()'可以。 –

+0

哇,是'atoi()'真的線程不安全在某些平臺上? – Celada