[英]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_MIN
和INT_MAX
在<limits.h>
)。 strtoul()
給你一個unsigned long
結果。 strtoll()
和strtoull
()分別為long long
和unsigned long long
; 它們是C99中的新功能,並且您的
編譯器
實現可能不支持它們(盡管大多數非Microsoft實現可能都支持它們)。
因為你溢出了一個如此大的值的int
。
此外, atoi
在許多平台上都被棄用並且不安全,所以你最好strto(l|ll|ul|ull)
它而轉向strto(l|ll|ul|ull)
。
考慮使用strtoull
代替。 由於unsigned long long
在大多數現代平台上都是64位類型,因此您可以將數字轉換為2 ^ 64
( 18446744073709551616
)。
要打印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.