我正在尝试编写一个将一串二进制数字转换为整数的函数。我为此使用了熟悉的函数-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);
}
仔细看这段代码:
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。