C语言 整数与字符串的相互转换

原链接:C语言 整数与字符串的相互转换

C语言 整数与字符串的相互转换

一、简述

    C语言中整数与字符串的相互转换,有广泛应用的拓展函数(非标准库),也可以自己尝试简单的实现。

二、整数转字符串

    1、拓展函数itoa

    itoa (表示 integer to alphanumeric)是把整型数转换成字符串的一个函数。

      windows环境下,在<stdlib.h>头文件中有

char* itoa(int value,char*string,int radix);//value: 要转换的整数,string: 转换后的字符串,radix: 转换进制数,如2,8,10,16 进制等。
 
 

函数源码:


 
 
  1. char* itoa(int num,char* str,int radix)
  2. {
  3. char index[]= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //索引表
  4. unsigned unum; //存放要转换的整数的绝对值,转换的整数可能是负数
  5. int i= 0,j,k; //i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。
  6. //获取要转换的整数的绝对值
  7. if(radix== 10&&num< 0) //要转换成十进制数并且是负数
  8. {
  9. unum=( unsigned)-num; //将num的绝对值赋给unum
  10. str[i++]= '-'; //在字符串最前面设置为'-'号,并且索引加1
  11. }
  12. else unum=( unsigned)num; //若是num为正,直接赋值给unum
  13. //转换部分,注意转换后是逆序的
  14. do
  15. {
  16. str[i++]=index[unum%( unsigned)radix]; //取unum的最后一位,并设置为str对应位,指示索引加1
  17. unum/=radix; //unum去掉最后一位
  18. } while(unum); //直至unum为0退出循环
  19. str[i]= '\0'; //在字符串最后添加'\0'字符,c语言字符串以'\0'结束。
  20. //将顺序调整过来
  21. if(str[ 0]== '-') k= 1; //如果是负数,符号不用调整,从符号后面开始调整
  22. else k= 0; //不是负数,全部都要调整
  23. char temp; //临时变量,交换两个值时用到
  24. for(j=k;j<=(i -1)/ 2;j++) //头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1
  25. {
  26. temp=str[j]; //头部赋值给临时变量
  27. str[j]=str[i -1+k-j]; //尾部赋值给头部
  28. str[i -1+k-j]=temp; //将临时变量的值(其实就是之前的头部值)赋给尾部
  29. }
  30. return str; //返回转换后的字符串
  31. }

 

示例程序:

 


 
 
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int number1 = 123456;
  6. int number2 = -123456;
  7. char string[ 16] = { 0};
  8. itoa(number1, string, 10);
  9. printf( "数字:%d 转换后的字符串为:%s\n",number1, string);
  10. itoa(number2, string, 10);
  11. printf( "数字:%d 转换后的字符串为:%s\n",number2, string);
  12. return 0;
  13. }

 

效果截图:

 

2、自己简单实现

实现代码


 
 
  1. #include <stdio.h>
  2. char* Int2String(int num,char *str); //函数声明
  3. int main()
  4. {
  5. int number1 = 123456;
  6. int number2 = -123456;
  7. char string[ 16] = { 0};
  8. Int2String(number1, string);
  9. printf( "数字:%d 转换后的字符串为:%s\n",number1, string);
  10. Int2String(number2, string);
  11. printf( "数字:%d 转换后的字符串为:%s\n",number2, string);
  12. return 0;
  13. }
  14. char* Int2String(int num,char *str)//10进制
  15. {
  16. int i = 0; //指示填充str
  17. if(num< 0) //如果num为负数,将num变正
  18. {
  19. num = -num;
  20. str[i++] = '-';
  21. }
  22. //转换
  23. do
  24. {
  25. str[i++] = num% 10+ 48; //取num最低位 字符0~9的ASCII码是48~57;简单来说数字0+48=48,ASCII码对应字符'0'
  26. num /= 10; //去掉最低位
  27. } while(num); //num不为0继续循环
  28. str[i] = '\0';
  29. //确定开始调整的位置
  30. int j = 0;
  31. if(str[ 0]== '-') //如果有负号,负号不用调整
  32. {
  33. j = 1; //从第二位开始调整
  34. ++i; //由于有负号,所以交换的对称轴也要后移1位
  35. }
  36. //对称交换
  37. for(;j<i/ 2;j++)
  38. {
  39. //对称交换两端的值 其实就是省下中间变量交换a+b的值:a=a+b;b=a-b;a=a-b;
  40. str[j] = str[j] + str[i -1-j];
  41. str[i -1-j] = str[j] - str[i -1-j];
  42. str[j] = str[j] - str[i -1-j];
  43. }
  44. return str; //返回转换后的值
  45. }

效果截图

三、字符串转整数

1、拓展函数
            atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数。
            windows环境下,在<stdlib.h>头文件中

int  atoi(const char *nptr);//字符串转整数函数,nptr: 要转换的字符串
 
 

源码:


 
 
  1. int atoi(const char *nptr)
  2. {
  3. return ( int)atol(nptr);
  4. }
  5. long atol(const char *nptr)
  6. {
  7. int c; /* 当前要转换的字符(一个一个字符转换成数字) */
  8. long total; /* 当前转换结果 */
  9. int sign; /* 标志转换结果是否带负号*/
  10. /*跳过空格,空格不进行转换*/
  11. while ( isspace(( int)( unsigned char)*nptr) )
  12. ++nptr;
  13. c = ( int)( unsigned char)*nptr++; //获取一个字符准备转换
  14. sign = c; /*保存符号标示*/
  15. if (c == '-' || c == '+')
  16. c = ( int)( unsigned char)*nptr++; /*跳过'+'、'-'号,不进行转换*/
  17. total = 0; //设置转换结果为0
  18. while ( isdigit(c)) { //如果字符是数字
  19. total = 10 * total + (c - '0'); /* 根据ASCII码将字符转换为对应的数字,并且乘10累积到结果 */
  20. c = ( int)( unsigned char)*nptr++; /* 取下一个字符 */
  21. }
  22. //根据符号指示返回是否带负号的结果
  23. if (sign == '-')
  24. return -total;
  25. else
  26. return total;
  27. }

 

示例程序:


 
 
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. printf( "字符串\"123456\"转换为数字:%d\n",atoi( "123456"));
  6. printf( "字符串\"-123456\"转换为数字:%d\n",atoi( "-123456"));
  7. return 0;
  8. }


效果截图:

 

 

2、自己简单实现

 

 

实现源码


 
 
  1. #include<stdio.h>
  2. int String2Int(char *str); //函数声明
  3. int main()
  4. {
  5. printf( "字符串\"123456\"转换为数字:%d\n",String2Int( "123456"));
  6. printf( "字符串\"-123456\"转换为数字:%d\n",String2Int( "-123456"));
  7. return 0;
  8. }
  9. int String2Int(char *str)//字符串转数字
  10. {
  11. char flag = '+'; //指示结果是否带符号
  12. long res = 0;
  13. if(*str== '-') //字符串带负号
  14. {
  15. ++str; //指向下一个字符
  16. flag = '-'; //将标志设为负号
  17. }
  18. //逐个字符转换,并累加到结果res
  19. while(*str>= 48 && *str< 57) //如果是数字才进行转换,数字0~9的ASCII码:48~57
  20. {
  21. res = 10*res+ *str++ -48; //字符'0'的ASCII码为48,48-48=0刚好转化为数字0
  22. }
  23. if(flag == '-') //处理是负数的情况
  24. {
  25. res = -res;
  26. }
  27. return ( int)res;
  28. }

 

截图

 

四、利用sprintf()函数和sscanf()函数    

       整数转字符串

       测试代码:

         


 
 
  1. #include <stdio.h>
  2. char* Int2String(int num,char *str); //函数声明
  3. int main()
  4. {
  5. int number1 = 123456;
  6. int number2 = -123456;
  7. char string[ 16] = { 0};
  8. Int2String(number1, string);
  9. printf( "数字:%d 转换后的字符串为:%s\n",number1, string);
  10. Int2String(number2, string);
  11. printf( "数字:%d 转换后的字符串为:%s\n",number2, string);
  12. return 0;
  13. }
  14. char* Int2String(int num,char *str)
  15. {
  16. sprintf(str, "%d", num);
  17. return str;
  18. }

       运行结果:

       字符串转整数

       测试代码:


 
 
  1. #include<stdio.h>
  2. int String2Int(char *str); //函数声明
  3. int main()
  4. {
  5. printf( "字符串\"123456\"转换为数字:%d\n",String2Int( "123456"));
  6. printf( "字符串\"-123456\"转换为数字:%d\n",String2Int( "-123456"));
  7. return 0;
  8. }
  9. int String2Int(char *str)//字符串转数字
  10. {
  11. char flag = '+'; //指示结果是否带符号
  12. long res = 0;
  13. if(*str== '-') //字符串带负号
  14. {
  15. ++str; //指向下一个字符
  16. flag = '-'; //将标志设为负号
  17. }
  18. sscanf(str, "%ld", &res);
  19. if(flag == '-')
  20. {
  21. res = -res;
  22. }
  23. return ( int)res;
  24. }

       运行结果:

       

五、附ASCII码表(部分)

 

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92/124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值