c语言十六进制 字符串,字符串转变为十六进制

得分:30

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

/******************************************************************************

*      编写了个进制转换程序,求鼓励。

*      常规思路:先转换成十进制,再转换成所需进制。所以最大只能转换到2^32-1。

*      我的思路:直接转换。

*      最近都在练习高精度,于是就把这个代码给搬过来了。

*      以下是代码:(原代码有错,现是改正后代码)

******************************************************************************/

#include

#include

char*change(char*dst,const char*src,int tobase,int frombase)

{

int carry=0,cnt,i,j,t;

const char index[]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"};/*转化为大写,若想改为小写只需更改这里即可*/

if(tobase<2||tobase>36||frombase<2||frombase>36)/*适用于2--36之间的进制转换*/

{

dst[0]=0;

return dst;

}

while(isspace(*src))src++;

for(dst[0]=0,cnt=1,i=0;src[i];i++)/*从这里开始把字符数组当做普通数组使用*/

{

if(isdigit(src[i]))

t=src[i]-'0';

else if(isupper(src[i]))/*大小写通用*/

t=src[i]-'A'+10;

else if(islower(src[i]))

t=src[i]-'a'+10;

else break;

if(t>=frombase)break;/*若需转换的所在位的数字大于或等于进制数则认为已经转换结束*/

for(j=0;j

{

if(j)dst[j]=(carry+=dst[j]*frombase)%tobase;

else dst[j]=(carry=dst[j]*frombase+t)%tobase;

carry/=tobase;/*这里要考虑溢出问题,写成

dst[j]=dst[j]*frombase+carry;

carry=dst[j]/tobase;

dst[j]%=tobase;

会出错。*/

}

while(carry)

{

dst[cnt++]=carry%tobase;

carry/=tobase;

}

}

for(i=0,j=cnt-1;i<=j;i++,j--)/*逆序并转化为字符*/

{

t=dst[i];

dst[i]=index[dst[j]];

dst[j]=index[t];

}

dst[cnt]=0;/*字符串结尾*/

return dst;

}

#define N 200

int main()

{

char dst[N],src[N];

int n1,n2;

while(~scanf("%s%d%d",src,&n1,&n2))/*输入原数、该数字的进制和需转换到的进制只支持非负整数的转换*/

{

puts(change(dst,src,n2,n1));

}

return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值