下标值也不是数组,也不是指针也不是向量

时间:2016-11-27 07:29:12

标签: c

这是我将二进制转换为十进制值的程序。

#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使得指针来自整数而没有强制转换”。

为什么我会得到这些以及如何修复它们?

2 个答案:

答案 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

只要用户仅输入01,它就会有效。在实际代码中,您应该检查用户是否确实这样做了。

最后你不应该在函数结束时调用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)函数。