繁体   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