繁体   English   中英

长字符串错误的Atoi

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM