c语言实现进制转换器

    xiaoxiao2023-03-24  4

    在了解了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; } #endif int 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。该程序只要输入需要转换的数据,数据的进制数和需要输出的进制数就可以得到结果。

    转载请注明原文地址: https://ju.6miu.com/read-1201857.html
    最新回复(0)