2016-11-27 94 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)函數。

相關問題