5

有人可以解释为什么atoi函数不适用于超过 9 位的 nmubers 吗?

例如:

当我输入: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;
}
4

3 回答 3

9

如果您关心错误处理,请不要使用atoi(), 或任何功能。atoi*()这些函数无法检测错误;既atoi(99999999999999999999)没有atoi("foo")也没有办法告诉你有问题。(我认为其中一种或两种情况实际上具有未定义的行为,但我必须检查以确定。)

这些strto*()函数使用起来有点棘手,但它们可以可靠地告诉您一个字符串是否代表一个有效数字,它是否在范围内,以及它的值是什么。(您必须处理errno以获得全面检查。)

如果您只想要一个 int 值,您可以使用strtol()(在错误检查后,它会给您一个long结果)并在检查结果是否在(参见in )的可表示范围内int之后将其转换为。 给你一个结果。 和() 分别代表和;它们是 C99 中的新功能,您的编译器实现可能不支持它们(尽管大多数非 Microsoft 实现可能支持)。intINT_MININT_MAX<limits.h>strtoul()unsigned longstrtoll()strtoulllong longunsigned long long

于 2011-10-16T15:14:38.790 回答
7

因为你溢出了int这么大的值。

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

考虑strtoull改用。由于unsigned long long在大多数现代平台上是 64 位类型,您将能够转换与2 ^ 64( 18446744073709551616) 一样大的数字。

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

于 2011-10-16T15:04:22.700 回答
0

如果您正在编写win32应用程序,那么您可以使用 atoi 的 windows 实现,有关详细信息,请查看以下页面。

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

于 2012-03-14T13:10:39.817 回答