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

时间:2011-10-16 15:02:59

标签: c atoi

有人可以解释为什么 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;
}

3 个答案:

答案 0 :(得分:9)

如果您关心错误处理,请不要使用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 longunsigned long long;它们是C99中的新功能,而您的编译器实现可能不支持它们(尽管大多数非Microsoft实现可能都支持它们)。

答案 1 :(得分:6)

因为int溢出了如此大的值。

此外,在许多平台上,atoi已被弃用且线程不安全,因此您最好放弃它以支持strto(l|ll|ul|ull)

请考虑使用strtoull。由于unsigned long long在大多数现代平台上都是64位类型,因此您可以将与2 ^ 6418446744073709551616)一样大的数字转换为。

要打印unsigned long long,请使用%llu格式说明符。

答案 2 :(得分:0)

如果你正在编写 win32 应用程序,那么你可以使用atoi的windows实现,详情请查看下面的页面。

  

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