cowchin12 cowchin12 - 1 month ago 22
C Question

Hexadecimal String to Binary String

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

Answer

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