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

4 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;
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 9

如果您关心错误处理,请不要使用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实现可能都支持它们).


Bla*_*iev 6

因为你满是int如此大的价值.

而且,atoi在许多平台上都被弃用并且不安全,因此你最好放弃它strto(l|ll|ul|ull).

考虑strtoull改用.由于unsigned long long在大多数现代平台上都是64位类型,因此您可以将数字转换为2 ^ 64(18446744073709551616).

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

  • `strtoull()`不会处理负数,也可能不适用于所有实现.`strtol()`对于int值是可以的. (2认同)