2016-11-09 20 views
0

ユーザーが16進数の文字列を入力するようにしようとしています(「3ecf、0xおよび大文字はありません」)。 )、binAddressにバイナリ相当値を格納します。16進文字列からバイナリ文字列へ

これを修正するにはどうすればよいですか?
これは簡単な方法ですか?

char address [6];//global 
char binAddress[24]; //global 
scanf("%s", address); //in some other function 

...

void hexToBin(){ 
int i = 0; 
int j = 24; 
int z; 
while(address[i]){ 
    char x[4]; //strcpy(char x, "0000") 
    switch(address[i]){ 
     case '0': strcpy(x, "0000"); break; 
     case '1': strcpy(x, "0001"); break; 
     case '2': strcpy(x, "0010"); break; 
     case '3': strcpy(x, "0011"); break; 
     case '4': strcpy(x, "0100"); break; 
     case '5': strcpy(x, "0101"); break; 
     case '6': strcpy(x, "0110"); break; 
     case '7': strcpy(x, "0111"); break; 
     case '8': strcpy(x, "1000"); break; 
     case '9': strcpy(x, "1001"); break; 
     case 'a': strcpy(x, "1010"); break; 
     case 'b': strcpy(x, "1011"); break; 
     case 'c': strcpy(x, "1100"); break; 
     case 'd': strcpy(x, "1101"); break; 
     case 'e': strcpy(x, "1110"); break; 
     case 'f': strcpy(x, "1111"); break; 
     default: strcpy(x, "0000"); break; 
    } 
    i++; 
    for (z = 3; z > -1; z--){ 
     binAddress[j] = x[z]; 
     j--; 
     printf("%c\n", binAddress[j]); 
    } 
} 
} 
+0

読む提供し、[尋ねます] a [mcve]。コードは不完全です。 – Olaf

+0

'char x [4];' - > 'char x [5];' – BLUEPIXY

答えて

1

このような修正:

#include <stdio.h> 
#include <string.h> 

char address[6+1]; //+1 for NUL 
char binAddress[6*4+1];//+1 for NUL 
void hexToBin(void); 

int main(void){ 
    scanf("%6s", address); 

    hexToBin(); 

    printf("%s\n", binAddress); 
    return 0; 
} 

void hexToBin(){ 
    int i, j; 

    for(j = i = 0; address[i]; ++i, j += 4){ 
     switch(address[i]){ 
     case '0': strcpy(binAddress + j, "0000"); break; 
     case '1': strcpy(binAddress + j, "0001"); break; 
     case '2': strcpy(binAddress + j, "0010"); break; 
     case '3': strcpy(binAddress + j, "0011"); break; 
     case '4': strcpy(binAddress + j, "0100"); break; 
     case '5': strcpy(binAddress + j, "0101"); break; 
     case '6': strcpy(binAddress + j, "0110"); break; 
     case '7': strcpy(binAddress + j, "0111"); break; 
     case '8': strcpy(binAddress + j, "1000"); break; 
     case '9': strcpy(binAddress + j, "1001"); break; 
     case 'a': strcpy(binAddress + j, "1010"); break; 
     case 'b': strcpy(binAddress + j, "1011"); break; 
     case 'c': strcpy(binAddress + j, "1100"); break; 
     case 'd': strcpy(binAddress + j, "1101"); break; 
     case 'e': strcpy(binAddress + j, "1110"); break; 
     case 'f': strcpy(binAddress + j, "1111"); break; 
     default: 
      printf("invalid character %c\n", address[i]); 
      strcpy(binAddress + j, "0000"); break; 
     } 
    } 
} 
0

あなたは、char配列に進格納する必要はありません。あなたはバイナリ(C-文字列形式)に変換後のx
http://www.cplusplus.com/reference/cstdio/scanf/

指定子%でのscanfを経由して、それを読むことができます how to print binary number via printf

+0

int型にアドレスを変更する必要はありますか? – cowchin12

+0

はい。しかし、unsigned longを使用することをお勧めします(32ビット整数、intはプラットフォームに依存するサイズです)。バイナリを&1uに変換すると、符号付きビットが問題を引き起こす可能性があります。 –

関連する問題