纯c语言实现16进制字符串向8进制转换

大致思路:创建动态储存空间输入要处理的数,转换为2进制后再转换为8进制

问题:2进制向8进制转换时需要在字符串首添加0,单纯地进行字符串连接会导致访问出错,不知道如何处理;
感觉当前方法效率过低,不知道是否有更简洁的方法。


#include"stdio.h"
#include"string.h"
#include"stdlib.h"

int main()
{
    int n,i;char *a,*b,*c;
    b=(char *)malloc(400000);
    memset(b, 0, 400000);
    a=(char *)malloc(400000);
    scanf("%s",a);
    getchar();
    for(i=0;i<strlen(a);i++)
        switch(a[i])
    {
        case'0':strcat(b,"0000");break;
        case'1':strcat(b,"0001");break;
        case'2':strcat(b,"0010");break;
        case'3':strcat(b,"0011");break;
        case'4':strcat(b,"0100");break;
        case'5':strcat(b,"0101");break;
        case'6':strcat(b,"0110");break;
        case'7':strcat(b,"0111");break;
        case'8':strcat(b,"1000");break;
        case'9':strcat(b,"1001");break;
        case'A':strcat(b,"1010");break;
        case'B':strcat(b,"1011");break;
        case'C':strcat(b,"1100");break;
        case'D':strcat(b,"1101");break;
        case'E':strcat(b,"1110");break;
        case'F':strcat(b,"1111");break;
    }
    printf("%s",b);
    memset(a,0,400000);
    n=strlen(b)%3;
    c=(char *)malloc(400000);
    //memset(c,0,400000);
    *c='0';//创建只有一位“0”的字符串
    i=0;
    while(i<(3-n))
    {
        strcpy(a,c);
        strcat(a,b);
        strcpy(b,a);
    };//通过字符串连接,将原字符串前补“0”
    free(c);
    memset(a,0,400000);
    for(i=0;i<strlen(b)%3;i++)//每3位一组,转换为8进制
    {
        if(*(b+i*3)==0&&*(b+i*3+1)==0&&*(b+i*3+2)==0)strcat(a,"0");
        if(*(b+i*3)==0&&*(b+i*3+1)==0&&*(b+i*3+2)==1)strcat(a,"1");
        if(*(b+i*3)==0&&*(b+i*3+1)==1&&*(b+i*3+2)==0)strcat(a,"2");
        if(*(b+i*3)==0&&*(b+i*3+1)==1&&*(b+i*3+2)==1)strcat(a,"3");
        if(*(b+i*3)==1&&*(b+i*3+1)==0&&*(b+i*3+2)==0)strcat(a,"4");
        if(*(b+i*3)==1&&*(b+i*3+1)==0&&*(b+i*3+2)==1)strcat(a,"5");
        if(*(b+i*3)==1&&*(b+i*3+1)==1&&*(b+i*3+2)==0)strcat(a,"6");
        if(*(b+i*3)==1&&*(b+i*3+1)==1&&*(b+i*3+2)==1)strcat(a,"7");
    }
    printf("%s",a);
}

麻烦了,谢谢。

img