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)代码实现
int my_atoi(char s[]) { int i,n,sign; for(i=0;isspace(s[i]);i++); <strong>//跳过空白</strong>,isspace()这个函数在type.h头文件中;也可以s[i]==' '实现 sign=(s[i]=='-')?-1:1; if(s[i]=='+'||s[i]=='-') <strong>//跳过符号位</strong> i++; for(n=0;isdigit(s[i]);i++) n=10*n+(s[i]-'0'); <strong>//将数字字符转换成整形数字</strong>,<span style="font-size: 13.3333339691162px; font-family: Arial, Helvetica, sans-serif;">isdigit()这个函数在type.h头文件中;也可以s[i]>='0' && s[i]<='9''实现; <span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; line-height: 18px; background-color: rgb(248, 248, 248);">0x30是 '0'</span></span> return sign*n; }(3) itoa()函数的原型:char *itoa( int value, char *str,int radix)
函数用途:将整数型值value转换成一个字符串
输入参数:value待转换的整型数 ;str目标字符串的地址,即返回值;radix:转换后的进制数,可以是10进制、16进制等。
返回值:成功返回一个字符串.
(4)代码实现
/* Converts an int or long into a character string 将一个整数转化为字符串 */ char* my_itoa(int n,char str[]) { int i,j,len,sign; if((sign=n)<0) //记录符号 n=-n; //使n成为正数 i=0; do{ str[i++]=n%10+'0'; //取下一个数字 }while((n/=10)>0); //循环相除 if(sign<0) str[i++]='-'; str[i]='\0'; len = i;// for(j=len-1,i=0;j>i;j--,i++) //生成的数字是逆序的,所以要交换 { str[j] ^= str[i]; str[i] ^= str[j]; str[j] ^= str[i]; } return str; }
(5) 主函数测试
#include "stdio.h" #include "ctype.h" #include "stdlib.h" int main() { int n; char str[32],*ans; ans = my_itoa(-123,str); printf("自编自导的整形转字符串函数my_itoa():%s %s\n",ans,str); printf("系统自带的整形转字符串函数itoa():%s %s\n",itoa(-1,str,16),str); printf("自编自导的字符串转整形函数my_atoi():%d\n",my_atoi(" 22qqq")); printf("系统自带的字符串转整形函数atoi():%d\n",atoi(" -2qqq ")); system("pause"); return 0; }
(6)测试结果:
三:不足之处
(1) itoa()函数的原型:char *itoa( int value, char *str,int radix),自己并未完全实现,只是简单的实现了10进制的
(2)下面会改进的,上面有不足之处,请大神指教
(3) itoa()函数的原型:char *itoa( int value, char *str,int radix),自己简单的实现,默认是实现了10进制的
char __itoa[] = {'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f'}; const unsigned int MY_MAX = 0xFFFFFFFFu; char* my_itoa2(int n,char str[],int radix=10) { int i,j,len,sign; unsigned int tmp; i = 0; if(n<0) // { tmp = MY_MAX + n + 1;// 这样貌似可以了,按照取反加一的方式进行的 do{ str[i++]=__itoa[tmp%radix]; //取下一个数字 }while((tmp/=radix)>0);//循环相除 } else { do{ str[i++]=__itoa[n%radix]; //取下一个数字 }while((n/=radix)>0);//循环相除 } str[i]='\0'; len = i;// for(j=len-1,i=0;j>i;j--,i++) //生成的数字是逆序的,所以要交换 { str[j] ^= str[i]; str[i] ^= str[j]; str[j] ^= str[i]; } return str; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。