2016-11-27 9 views
0

これはバイナリを10進値に変換する私のプログラムです。サブスクリプトされた値も配列もポインタもベクトルでもない

#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'は、だから私は、配列としてそれを使用する必要があります' unsigned long型の長int'、ないポインタや配列... – StoryTeller

+0

@StoryTellerのですか? –

+0

もしそれを1つとして使用しようとするならば、それを配列として宣言する必要があります。 – 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); 

がオーバーフローからバッファを防ぐために。

次に、この部分:ビン[i]は番号が、文字ではないよう

dec = dec + (bin[i] * pow (2, 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 

あなたは配列として符号なしlong longの型の変数を使用しようとしています。すべての数値型は完全な値として扱われます。配列インデックスを使用して別々の数字にアクセスすることはできません。配列として使用する場合は、char *または文字配列を使用してください。

また、符号なしlong longをstrlen(const char * str)関数に渡しています。

関連する問題