c++实现atoi()和itoa()函数(字符串和整数转化)

一:起因

(1)字符串类型转化为整数型(Integer),还是字符串类型(String)转化为Double类型,这在java里面有非常好的内部函数,很easy的事情;

(2)但是在c里面没有Integer Double等包装类,由char[]数组转化为整数型就变得不那么简单了,atoi()  itoa()在widows下面有,但是网上说linux 下好像没有 itoa() 函数,用 sprintf() 好了,但是本人测试了一下sprintf()  sscanf()的效率很低。

(3)所以自己手动实现了一下atoi()(字符串转整数)  itoa(整数转字符串)两个函数,有哪里不对的地方,大家指正。

二:实现

(1)atoi()函数原型:int atoi(char *str)  头文件 stdlib.h

函数用途:将字符串转换成一个整数值
输入参数:str 待转换为整型数的字符串
返回值:成功返回转换后的数值,失败则返回0.

(2)代码实现

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int my_atoi(char s[])  
  2. {  
  3.     int i,n,sign;  
  4.   
  5.     for(i=0;isspace(s[i]);i++);   //跳过空白,isspace()这个函数在type.h头文件中;也可以s[i]==' '实现  
  6.   
  7.     sign=(s[i]=='-')?-1:1;  
  8.     if(s[i]=='+'||s[i]=='-')     //跳过符号位  
  9.         i++;  
  10.     for(n=0;isdigit(s[i]);i++)  
  11.         n=10*n+(s[i]-'0');    //将数字字符转换成整形数字,isdigit()这个函数在type.h头文件中;也可以s[i]>='0' && s[i]<='9''实现; 0x30是 '0'  
  12.     return sign*n;  
  13. }  
(3) itoa()函数的原型:char *itoa( int value, char *str,int radix)

函数用途:将整数型值value转换成一个字符串
输入参数:value待转换的整型数 ;str
目标字符串的地址,即返回值;radix:转换后的进制数,可以是10进制、16进制等。

返回值:成功返回一个字符串.

(4)代码实现

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. Converts an int or long into a character string 
  3. 将一个整数转化为字符串 
  4. */  
  5. char* my_itoa(int n,char str[])  
  6. {  
  7.     int i,j,len,sign;  
  8.   
  9.     if((sign=n)<0)    //记录符号  
  10.         n=-n;         //使n成为正数  
  11.     i=0;  
  12.     do{  
  13.         str[i++]=n%10+'0';    //取下一个数字  
  14.     }while((n/=10)>0);      //循环相除  
  15.   
  16.     if(sign<0)  
  17.         str[i++]='-';  
  18.     str[i]='\0';  
  19.     len = i;//  
  20.     for(j=len-1,i=0;j>i;j--,i++)        //生成的数字是逆序的,所以要交换  
  21.     {  
  22.         str[j] ^= str[i];  
  23.         str[i] ^= str[j];  
  24.         str[j] ^= str[i];  
  25.     }  
  26.     return str;  
  27. }  

(5) 主函数测试

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "stdio.h"  
  2. #include "ctype.h"  
  3. #include "stdlib.h"  
  4. int main()  
  5. {  
  6.     int n;  
  7.     char str[32],*ans;  
  8.     ans = my_itoa(-123,str);  
  9.     printf("自编自导的整形转字符串函数my_itoa():%s %s\n",ans,str);  
  10.     printf("系统自带的整形转字符串函数itoa():%s %s\n",itoa(-1,str,16),str);  
  11.     printf("自编自导的字符串转整形函数my_atoi():%d\n",my_atoi("  22qqq"));  
  12.     printf("系统自带的字符串转整形函数atoi():%d\n",atoi("  -2qqq "));  
  13.     system("pause");  
  14.     return 0;  
  15. }  

(6)测试结果:



三:不足之处

(1) itoa()函数的原型:char *itoa( int value, char *str,int radix),自己并未完全实现,只是简单的实现了10进制的

(2)下面会改进的,上面有不足之处,请大神指教

(3) itoa()函数的原型:char *itoa( int value, char *str,int radix),自己简单的实现,默认是实现了10进制的

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. char __itoa[] = {'0','1','2','3','4','5','6','7','8','9',  
  2.                 'a','b','c','d','e','f'};  
  3. const unsigned int MY_MAX = 0xFFFFFFFFu;  
  4. char* my_itoa2(int n,char str[],int radix=10)  
  5. {  
  6.     int i,j,len,sign;  
  7.     unsigned int tmp;  
  8.     i = 0;  
  9.     if(n<0)    //  
  10.     {  
  11.         tmp = MY_MAX + n + 1;// 这样貌似可以了,按照取反加一的方式进行的  
  12.         do{  
  13.             str[i++]=__itoa[tmp%radix];    //取下一个数字  
  14.         }while((tmp/=radix)>0);//循环相除  
  15.     }  
  16.     else  
  17.     {  
  18.         do{  
  19.             str[i++]=__itoa[n%radix];    //取下一个数字  
  20.         }while((n/=radix)>0);//循环相除  
  21.     }  
  22.   
  23.     str[i]='\0';  
  24.     len = i;//  
  25.     for(j=len-1,i=0;j>i;j--,i++)        //生成的数字是逆序的,所以要交换  
  26.     {  
  27.         str[j] ^= str[i];  
  28.         str[i] ^= str[j];  
  29.         str[j] ^= str[i];  
  30.     }  
  31.     return str;  
  32. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值