簡體   English   中英

C中的atoi功能無法正常工作

[英]atoi function in C not working properly

有人可以解釋為什么atoi函數不能與超過9位的nuber一起工作。
例如:

我輸入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;
}

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

strto*()函數使用起來有點棘手,但它們可以可靠地告訴您字符串是否表示有效數字,是否在范圍內,以及它的值是什么。 (你必須處理errno以獲得全面檢查。)

如果你只是想要一個int值,你可以使用strtol()其中,錯誤檢查后,給你一個long的結果),並將其轉換為int 檢查的結果是在可表現范圍后, int (見INT_MININT_MAX<limits.h> )。 strtoul()給你一個unsigned long結果。 strtoll()strtoull ()分別為long longunsigned long long ; 它們是C99中的新功能,並且您的 編譯器 實現可能不支持它們(盡管大多數非Microsoft實現可能都支持它們)。

因為你溢出了一個如此大的值的int

此外, atoi在許多平台上都被棄用並且不安全,所以你最好strto(l|ll|ul|ull)它而轉向strto(l|ll|ul|ull)

考慮使用strtoull代替。 由於unsigned long long在大多數現代平台上都是64位類型,因此您可以將數字轉換為2 ^ 6418446744073709551616 )。

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

如果你正在編寫win32應用程序,那么你可以使用atoi的windows實現,詳情請查看下面的頁面。

http://msdn.microsoft.com/en-us/library/czcad93k%28v=vs.80%29.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM