浅析itoa

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的哦^ _ ^

原文地址:https://www.cnblogs.com/freewater/p/2892180.html