[英]Atoi of a long string error
我有以下代码:
char kbits [k]; 长整数位;
kbits字符串始终填充为“ 1”,例如:
如果k = 5,则kbits =“ 11111”
如果k = 9,则kbits =“ 111111111”
为此,我使用以下代码:
for(i = 0; i <k; i ++)kbits [i] ='1';
然后我运行:
位= atoi(kbits);
因此,我有kbit的整数,例如,如果kbits =“ 1111”,则bit = 1111;
对于k <= 10,它运行得很好。
对于k> 10,它将在k位的最后一个位置放置7(例如,如果k = 11,kbits = 11111111117)而位= 2147483647(此值对于k的任何值,我认为它是随机的?)
对于返回类型,您的输入太大。 根据文档:
如果无法表示转换后的值,则行为是不确定的。
int是至少 16位的有符号类型。 在您的平台上,它可能是32位,在这种情况下,其最大值是2 ^ 31-1。 对于您的约110亿美元的投入来说太小了。 使用strtol
,它返回一个long int
。
另外,请确保您要终止该字符串。
atoi
将其输入解释为十进制数字,而不是二进制数字。 您的较长字符串导致该值溢出,在这种情况下, atoi
的返回值是不确定的(尽管返回INT_MAX
是常见的,它等于您看到的值)。
要将输入解释为二进制数,可以使用strtol
如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
int main()
{
char line[256];
while (printf("\nInput: "),
fgets(line, sizeof line, stdin))
{
// skip initial whitespace and break if input is nothing but whitespace
char *p = line;
while (isspace(*p)) ++p;
if (*p == '\0') break;
// interpret input as a binary number
long n = strtol(line, &p, 2);
if (p == line)
printf("** Can't convert any characters. **\n");
else if (n == LONG_MAX || n == LONG_MIN)
printf("** Range error **\n");
else
printf("Value: %ld\n", n); // prints value in decimal
while (isspace(*p)) ++p; // skip whitespace after the value
if (*p != '\0')
printf("** Excess characters in input **\n");
}
return 0;
}
2147483647(此值适用于k的任何值,我认为它是随机的?)
不,它不是随机的; 它是一个有符号的32位整数可以容纳的最大值。
您的输入太大。
发生这种情况时, atoi
的返回值是不确定的(根据文档 ); 您看到的结果在实践中很常见。
定义kbits
是一个字节长则数1
要存储和做初始化所有小号0
秒。
#define K (5)
char kbits[K + 1] = ""; /* One more for the `0`temrination neseccary to terminate a C-"string". */
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.