c语言实现进制转换器

来源:互联网 发布:密度板的甲醛 知乎 编辑:程序博客网 时间:2024/05/01 22:18

在了解了c语言中atoi和itoa函数以后,分别对其进行了实现。并以这两个函数为基础编写了一个任意进制的相互转换器。过程可分为两个步骤,先将任意进制的字符串转利用atoi函数换成10进制数,再将10进数输通过itoa转成对应进制的整形进行输出。


c源代码

#include<stdio.h>#include<stdlib.h>#include<string.h>//整形转字符,radix为输出进制类型,str来存储输出字符串,value为输入10进制数,并返回字符串头指针char* myitoa(int value,char *str,int radix){    int stack[100] = {0},top=0;    char *head = str;    while(value!=0)    {        stack[++top]=value%radix;        value = value/radix;    }    while(top!=0)    {        if(radix<10)        {            *(str++) = stack[top--]+'0';        }        else        {            if(stack[top]>=10)            {                *(str++) = stack[top--]-10+'a';            }            else                *(str++) = stack[top--]+'0';        }    }    *(str) = '\0';    return head;}//指数运算,a为基数,b为幂,用于atoi函数中,其实也可以通过引用math.h头文件中的pow函数int power(int a,int n){    int tmp = a;    if(n==0)    {    return 1;    }    else    {        while(n-->1)        {            tmp = tmp*a;            }        return tmp;    }}#if 1//字符转整形,str用来输入字符串,radix为输入进制类型,将字符转换成10进制返回int myatoi(char *str,int radix){    int l = strlen(str);    int sum = 0,tmp = 0,i = 0;    for(i = 0;i<l;i++)    {        if(radix<10)        {            tmp = *(str+i)-'0';            tmp = power(radix,l-1-i)*tmp;            sum  = sum + tmp;        }        else        {            tmp = *(str+i)-'0';            if(tmp<10&&tmp>=0)            {                tmp = power(radix,l-1-i)*tmp;                sum  = sum + tmp;            }            else            {                tmp = *(str+i)-'a'+10;                tmp = power(radix,l-1-i)*tmp;                sum = sum + tmp;            }        }    }    return sum;}#endifint main(){//用来测试/*  char *str = malloc(20);    int result = 0;    str = myitoa(127,str,10);    result = strlen(str);    result = myatoi(str,10);    printf("num: %s\n",str);    printf("result: %d\n",result);*/    char *str = malloc(20);    int radix = 0,tmp = 0;    printf("input number string:");    gets(str);    //注意gets函数会产生警告,容易发生堆栈溢出,可用fgets或scanf来代替    printf("input original radix:");    scanf("%d",&radix);    tmp = myatoi(str,radix);    printf("input radix what to exchange:");    scanf("%d",&radix);    str = myitoa(tmp,str,radix);    printf("result:%s\n",str);    return 0;}

运行结果

运行结果

这里将10进制数1234转换成12进制数,结果为86a,又将12进制数86a转换成10进制数,结果为1234。该程序只要输入需要转换的数据,数据的进制数和需要输出的进制数就可以得到结果。

0 0
原创粉丝点击