将二进制数字字符串转换为long int

问题描述 投票:0回答:1

我正在尝试编写一个将一串二进制数字转换为整数的函数。我为此使用了熟悉的函数-strtol,据我所知,它应该返回一个long int变量。该程序适用于短字符串,但对于较大的输入,它将产生最大的int数,我不知道为什么。我希望数字故意为小数形式。这是我写的内容,但仍然无法使用,我不知道为什么。

char bin_num[MAX_SIZE];
        int FLAG = 1;
        scanf("%s", bin_num);
        int i = 0;
        while (bin_num[i] != '\0')
        {
            if ((bin_num[i] != '1') && (bin_num[i] != '0'))
            {
                printf(QUESTION1_ERROR_MESSAGE);
                FLAG = 0;
                break;
            }
            i++;
        }
        if (FLAG == 0)
            break;
        else {
             unsigned long long int ret;
            ret = strtoul(bin_num,NULL,10);
            printf("%lli", ret); 
        }
c string int digits
1个回答
0
投票

仔细看这段代码:

        long int ret;
        char* ptr;
        ret=strtol(bin_num, &ptr, 10);

您对strtol的使用不正确。第二个参数应该是指向转换的最后一个字符或NULL的指针(在这种情况下,它将被忽略)。您正在使用未初始化的指针,该指针调用undefined behaviour。另外,您应该指定基数2(对于二进制)。

基于本手册:http://www.cplusplus.com/reference/cstdlib/strtol/

long int strtol (const char* str, char** endptr, int base);

str

C字符串以整数表示。

endptr

引用为char *类型的对象,其值由 数值后面的str中的下一个字符。这个 参数也可以是空指针,在这种情况下不使用它。

base

确定有效字符及其数字的基数(基数) 解释。如果为0,则使用的基数由 按顺序格式化(请参见上文)。

所以实际上您可能应该将代码更改为:

    long int ret;
    ret=strtol(bin_num, NULL, 2);

并且不要忘记检查ret中返回的值:

成功后,函数将转换后的整数返回为 long int值。如果无法执行有效的转换,则为零 返回值(0L)。如果读取的值是超出范围的 long int表示的值,该函数返回LONG_MAX或 LONG_MIN(在中定义),并且errno设置为ERANGE。

© www.soinside.com 2019 - 2024. All rights reserved.