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;

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部