0

I'm trying to make a program where the user enters a hexadecimal string ("in format 3ecf, no 0x and no capitals") The code below is my attempt to copy what the user enters (address) and store its binary equivalent in binAddress.

How do I fix this?
Or is there an easier way?

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]);
    }
}
}
chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256

2 Answers2

0

You don't need to store hexadecimal in char array. You can read it via scanf with specifier %x
http://www.cplusplus.com/reference/cstdio/scanf/

Then convert it to binary (C-string form) how to print binary number via printf

Community
  • 1
  • 1
khôi nguyễn
  • 626
  • 6
  • 15
  • Do I have to change address to type int? –  Nov 09 '16 at 03:18
  • yes. But I recommend to use unsigned long (to make sure it 32bit integer, int is platform dependent size), when convert it to binary use &1u, the signed bit may cause trouble. – khôi nguyễn Nov 09 '16 at 03:59
0

fix like this:

#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;
        }
    }
}
BLUEPIXY
  • 39,699
  • 7
  • 33
  • 70