itoa是广泛应用的非标准C语言扩展函数。由于它不是标准C语言函数,所以不能在所有的编译器中使用。但是,大多数的编译器(如Windows上的)通常在<stdlib.h>头文件中包含这个函数。在<stdlib.h>中与之有相反功能的函数是atoi。功能:把一整数转换为字符串。
那么如何实现一个itoa函数呢?这个好像难度一般,我就直接附上我的实现,对此不熟悉的人最好自己code一下。
atoi version one
1 /* reverse the string named s */ 2 void reverse(char s[]) 3 { 4 for(int i=0,j=strlen(s)-1;i<j;i++,j--) 5 { 6 //s[i] <-> s[j] 7 char tmp=s[i]; 8 s[i]=s[j]; 9 s[j]=tmp; 10 } 11 } 12 13 void itoa(int n,char s[]) 14 { 15 int sign; 16 if((sign=n)<0)//record sign 17 n=-n;//make n positive 18 19 int i=0; 20 do{ 21 s[i++]=n%10+'0';//convert one digit to character, and store. 22 }while((n/=10)>0); 23 24 if(sign<0) 25 s[i++]='-'; 26 s[i]='\0'; 27 reverse(s); 28 }
但是atoi版本1有一个bug,不知道你有没有发现。
那就是当n=INT_MIN时,转化出错。这主要是因为n=-n;引起的。
如何解决这个问题,需要知道在Windows上,-25%10等于-5。(UNIX不知道正确否)
这样,atoi版本2出炉了。
atoi version two
1 void itoa2(int n,char s[]) 2 { 3 int sign=n; 4 int i=0; 5 do{ 6 s[i++]=abs(n%10)+'0'; 7 }while(n/=10); 8 if(sign<0) 9 s[i++]='-'; 10 s[i++]='\0'; 11 reverse(s); 12 }
至此,atoi的实现告一段落。唉,记得面试微软的时候被要求写出atoi,我就写了个version one。后来面试官问我有没有bug,如何测试,都回答出来了。但是问我怎么解决,当时没有答好,我当时的解决方案是将int换为long,现在想起来真是汗颜。呵呵~
Windows中<stdlib.h>提供了atoi函数,默认实现是
char *_itoa( int value, char *str, int radix //进制 );
或者为其安全版本_atoi_s。当然其实现是没有上文所述的bug的哦^ _ ^