这是我将二进制转换为十进制值的程序。
#include <stdio.h>
#include <string.h>
#include <math.h>
void con(){
unsigned long long int dec = 0, bin;
int i;
printf ("\n Binary : ");
scanf("%lld",&bin);
for (i = strlen(bin) - 1; i <= 0; --i){ // Warning in here
dec = dec + (bin[i] * pow (2, i)); // Error in here
}
printf(" Decimal : %lld",dec);
con();
}
int main(){
con();
return 0;
}
当我编译代码时,出现此错误,“下标值既不是数组也不是指针也不是向量”。并且这个警告也是,“传递strlen的参数1使得指针来自整数而没有强制转换”。
为什么我会得到这些以及如何修复它们?
答案 0 :(得分:2)
您的代码存在许多问题。
最重要的是变量bin
。您可能希望它是一个类似“1001001001”的字符串,但您将其定义为unsigned long long int
。相反,你应该这样做:
char bin[100];
scanf("%s", bin); // Note: Not recommended! Use fgets instead.
此处不建议使用scanf
,因为用户可能会溢出缓冲区。请改用fgets
。
正如@MayurK所建议的那样:如果你想使用scanf
那么至少要这样做:
scanf("%99s", bin);
防止缓冲区溢出。
然后这部分:
dec = dec + (bin[i] * pow (2, i));
错误,因为bin [i]不是数字而是char。
你可以这样做:
dec = 2 * dec + (bin[i] - '0'); // Note: No error checks which is bad
只要用户仅输入0
和1
,它就会有效。在实际代码中,您应该检查用户是否确实这样做了。
最后你不应该在函数结束时调用con
,因为它会给出无限循环。所以删除那个电话:
printf(" Decimal : %lld",dec);
// DELETE THIS con();
}
答案 1 :(得分:1)
dec = dec + (bin[i] * pow (2, i)); //bin is a numeric type
在这一行中,您尝试使用 unsigned long long 类型的变量作为数组。每种数字类型都被视为完整值,您不能使用数组索引来访问单独的数字。如果要将其用作数组,请使用char *或字符数组。
并且您还将 unsigned long long 传递给strlen(const char * str)函数。