[牛人杂谈] 字符存储的数字与int之间互转

[复制链接]
688|8
 楼主| heisexingqisi 发表于 2019-12-4 19:41 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int i=0;
  6.     char str[16]={0};

  7. while(1)
  8.    {

  9.    printf("请输入一个10进制整数:");
  10.    scanf("%d",&i);
  11.    itoa(i,str,10);
  12.    printf("这个10进制整数是:%s\n",str);
  13.    itoa(i,str,16);
  14.    printf("这个16进制整数是:%s\n",str);
  15.    printf("----------------------------\n");
  16.    printf("请输入一个16进制整数:");
  17.    scanf("%x",&i);
  18.    itoa(i,str,16);
  19.    printf("这个16进制整数是:%s\n",str);
  20.    printf("这个数的十进制是:%d\n",i);

  21.    }

  22. }


 楼主| heisexingqisi 发表于 2019-12-4 19:42 | 显示全部楼层
使用库函数确实很方便。但是这只能转字符串的10进制。转16进制的字符串到int还需要自己实现。
zhuotuzi 发表于 2019-12-4 21:15 | 显示全部楼层
非常给力,大家一起研究一下一个字符串怎么按16进制转换。
zhuotuzi 发表于 2019-12-4 23:40 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int Hex2Dec(char tem)
  5. {
  6.       if((tem=='A')&&(tem=='a')) return 10;
  7. else if((tem=='B')&&(tem=='b')) return 11;
  8. else if((tem=='C')&&(tem=='c')) return 12;
  9. else if((tem=='D')&&(tem=='d')) return 13;
  10. else if((tem=='E')&&(tem=='e')) return 14;
  11. else if((tem=='F')&&(tem=='f')) return 15;
  12. else if((tem>='0')&&(tem<='9')) return tem-'0';
  13. }
  14. int AsciiHexToInt(char *p)
  15. {
  16.     int val=0;
  17.     char tt;
  18.     unsigned char i = strlen(p);
  19.     printf("\n字符串长度=%d\n",i);
  20.    while(i>0)
  21.     {
  22.         tt=*p++;
  23.         val += (Hex2Dec(tt)*pow(16,(i-1)));
  24.         i--;
  25.     }
  26. //   val +=Hex2Dec(*(p++))*16^((i--)-1);
  27.     return val;
  28. }


  29. int main()
  30. {
  31.     int i=0;
  32.     char str[16]={0};
  33.     char id[40];

  34. while(1)
  35.    {
  36. /*
  37.    printf("请输入一个10进制整数:");
  38.    scanf("%d",&i);
  39.    itoa(i,str,10);
  40.    printf("这个10进制整数是:%s\n",str);
  41.    itoa(i,str,16);
  42.    printf("这个16进制整数是:%s\n",str);
  43.    printf("----------------------------\n");
  44.    printf("请输入一个16进制整数:");
  45.    scanf("%x",&i);
  46.    itoa(i,str,16);
  47.    printf("这个16进制整数是:%s\n",str);
  48.    printf("这个数的十进制是:%d\n",i);
  49.    */
  50.    printf("----------------------------\n");
  51.    printf("请输入一个16进制整数:");
  52.    scanf("%s",&id);
  53.    printf("\n输入的字符串是%s\n",id);
  54.    i=AsciiHexToInt(id);
  55.    printf("i=%d\n",i);

  56.    }

  57. }
zhuotuzi 发表于 2019-12-4 23:41 | 显示全部楼层
经过了俩小时不懈努力,帮楼主实现了。
其实还可以这样,先判断是不是有0x开头,如果有,那么就把后面的作为16进制读取,如果存储的话,一般也不用写0x。有空谁在增加的识别开头字符串是不是带0x或0X.
zhuotuzi 发表于 2019-12-4 23:46 | 显示全部楼层
本帖最后由 zhuotuzi 于 2019-12-4 23:49 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int Hex2Dec(char tem)
  5. {
  6.       if((tem=='A')||(tem=='a')) return 10;
  7. else if((tem=='B')||(tem=='b')) return 11;
  8. else if((tem=='C')||(tem=='c')) return 12;
  9. else if((tem=='D')||(tem=='d')) return 13;
  10. else if((tem=='E')||(tem=='e')) return 14;
  11. else if((tem=='F')||(tem=='f')) return 15;
  12. else if((tem>='0')&&(tem<='9')) return tem-'0';
  13. }
  14. int AsciiHexToInt(char *p)
  15. {
  16.     int val=0;
  17.     char tt;
  18.     unsigned char i = strlen(p);
  19.     printf("\n字符串长度=%d\n",i);
  20.    while(i>0)
  21.     {
  22.         tt=*p++;
  23.         val += (Hex2Dec(tt)*pow(16,(i-1)));
  24.         i--;
  25.     }
  26. //   val +=Hex2Dec(*(p++))*16^((i--)-1);
  27.     return val;
  28. }


  29. int main()
  30. {
  31.     int i=0;
  32.     char str[16]={0};
  33.     char id[40];

  34. while(1)
  35.    {
  36. /*
  37.    printf("请输入一个10进制整数:");
  38.    scanf("%d",&i);
  39.    itoa(i,str,10);
  40.    printf("这个10进制整数是:%s\n",str);
  41.    itoa(i,str,16);
  42.    printf("这个16进制整数是:%s\n",str);
  43.    printf("----------------------------\n");
  44.    printf("请输入一个16进制整数:");
  45.    scanf("%x",&i);
  46.    itoa(i,str,16);
  47.    printf("这个16进制整数是:%s\n",str);
  48.    printf("这个数的十进制是:%d\n",i);
  49.    */
  50.    printf("----------------------------\n");
  51.    printf("请输入一个16进制整数:");
  52.    scanf("%s",&id);
  53.    printf("\n输入的字符串是%s\n",id);
  54.    i=AsciiHexToInt(id);
  55.    printf("i=%d\n",i);

  56.    }

  57. }
zhuotuzi 发表于 2019-12-4 23:47 | 显示全部楼层
不好意思,第一次发的,逻辑搞错了,或应该是||
我写成了&&与,所以不对。。。
zhuotuzi 发表于 2019-12-4 23:47 | 显示全部楼层
另外应该添加个报错的,如果输入的字符串里面不是0~9或者A到F,或者a~f,那么应该输出一个错误消息。添加上。
玛尼玛尼哄 发表于 2019-12-14 21:16 | 显示全部楼层
方法不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

2770

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部