2016-11-27 93 views
0

这是我的程序,用于将二进制数转换为十进制值。下标值,数组或指针也不向量

#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

'bin'是'无符号长长int',而不是一个指针或数组... – StoryTeller

+0

@StoryTeller所以我应该把它作为一个数组? –

+0

如果您打算将其作为一个数组使用,则应将其声明为数组。 – StoryTeller

回答

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)); 

是错误的,因为仓[i]是不是数字而是一个字符。

你可以这样做:

dec = 2 * dec + (bin[i] - '0'); // Note: No error checks which is bad 

它将只要用户只输入01工作。在真实的代码中,你应该检查用户是否确实这样做了。

最后,你不应该在函数结束时调用con,因为它会给出一个无限循环。因此,删除通话:

printf(" Decimal : %lld",dec); 

    // DELETE THIS con(); 

} 
+0

更好的scanf(“%99s”,bin);. – MayurK

+0

@MayurK - 谢谢 - 好点。有一段时间我忘记了这种可能性,因为我总是使用'fgets'来代替。回答已更新您的建议。 – 4386427

1
dec = dec + (bin[i] * pow (2, i)); //bin is a numeric type 

在该行中,试图使用无符号长长类型阵列的变量。每个数字类型都被视为完整值,您不能使用数组索引来访问单独的数字。如果你想使用它作为一个数组使用char *或字符数组。

而且您还将一个无符号long long传递给strlen(const char * str)函数。

相关问题