进制转换实例

#include <stdio.h>
#include <stdlib.h>

void trans(char strnum[],int n);
int strToInt(char strnum[],int hex);
char *intToX(int num,int hex);

int main(int argc,char argv[]){
#if 1
char *nump;
char *p = malloc(13);
nump = p;
char c;
int size = 0;
printf("请输入你要转换的数:\n");
while((c = getchar()) != '\n'){
*p = c;
p++;
size++;
}
//printf("nump:%s,size:%d\n",nump,size);
//转换
trans(nump,size);
#endif
//int num = 0;
//scanf("%d",&num);
//printf("After:%s\n",intToX(num,2));
exit(0);
}

/**
*进制转换:将输入的字符串类型的数转换成另三种进制的数。只支持2、8、10、16三种进制的相互转换
*各进制数后面加(进制)表示,如2进制:0010(2)
*/
void trans(char strnum[],int n){
//保存进制
char type[3] = {0};
//保存需转换的数
char num[9] = {0};
int i;
for(i = 0;i < n;i++){
if(strnum[i] != '(')
num[i] = strnum[i];
else if(strnum[i] = '('){
type[0] = strnum[i + 1];
if(strnum[i + 2] != ')'){
type[1] = strnum[i + 2];
i = i + 4;
}else{
i = i + 3;
}
}
}
//printf("进制:%s;数:%s\n",type,num);//%s输出默认至发现'\0'结束
//将字符和进制都转成10进制整数
int intType = strToInt(type,10);
int intNum = strToInt(num,intType);
//printf("整数:num=%d,type=%d\n",intNum,intType);
#if 1
char *rp;
if(intType == 2){
printf("10进制:%d\n",intNum);
rp = intToX(intNum,2);
printf("2进制:%s\n",rp);
rp = intToX(intNum,8);
printf("8进制:%s\n",rp);
rp = intToX(intNum,16);
printf("16进制:%s\n",rp);
}else if(intType == 8){
printf("10进制:%d\n",intNum);
rp = intToX(intNum,2);
printf("2进制:%s\n",rp);
rp = intToX(intNum,8);
printf("8进制:%s\n",rp);
rp = intToX(intNum,16);
printf("16进制:%s\n",rp);
}else if(intType == 10){
printf("10进制:%d\n",intNum);
rp = intToX(intNum,2);
printf("2进制:%s\n",rp);
rp = intToX(intNum,8);
printf("8进制:%s\n",rp);
rp = intToX(intNum,16);
printf("16进制:%s\n",rp);
}else if(intType == 16){
printf("10进制:%d\n",intNum);
rp = intToX(intNum,2);
printf("2进制:%s\n",rp);
rp = intToX(intNum,8);
printf("8进制:%s\n",rp);
rp = intToX(intNum,16);
printf("16进制:%s\n",rp);
}
#endif
}


/*
*字符转成整数
*参数:strnum,需转换的字符;hex,进制
*
*/
int strToInt(char strnum[],int hex){

int value = 0;
char *p;
p = strnum;
while(*p != '\0'){
//16进制
if(hex == 16){
if(*p >= '0' && *p <= '9'){
value = value * hex + *p - '0';
}else{
value = value * hex + *p - 'a' + 10;
}
}else{
//其他进制
value = value * hex + *p - '0';
}
p++;
}
//printf("value=%d\n",value);
return value;
}

/**
*功能:将10进制数转成指定进制的数
*参数:num需转换的数;hex需转换成的进制
*/
char *intToX(int num,int hex){

char *p = malloc(12);
int size = 0;
while(num){
int mod = num % hex;
if(mod >= 0 && mod <= 9){
*p = mod + '0';
}else{
*p = mod + 'a' - 10;
}
num = num / hex;
p++;
size++;
}
//少于8位,用0补全
int j;
for(j = 0;j < 8 - size;j++){
*p = '0';
p++;
}
//倒序返回
int i;
//printf("size:%d\n",size);
//printf("p:%s\n",p);
char *rp = malloc(12);
p--;//指针指向最后一个元素
for(i = 0;i < 8;i++){
*rp = *p;
rp++;
p--;
}
rp = rp - 8;//指针指向第一个元素
//printf("rp:%s\n",rp);
return rp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值