zoukankan      html  css  js  c++  java
  • 浅析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的哦^ _ ^

  • 相关阅读:
    转ANYTAO的学习方法
    第一次写文章
    分享一个有趣的学习方法,欢迎一起探讨如何提高学习兴趣
    SQL基础
    insert into 后获得自动插入的id(select @@identity)
    如何向ASP.NET Web 服务器控件添加客户端脚本事件
    关键字using的主要用途
    网页设计师必备的10个CSS技巧
    DataSet与DataReader的区别
    由于系统时间修改导致Oracle启动失败
  • 原文地址:https://www.cnblogs.com/freewater/p/2892180.html
Copyright © 2011-2022 走看看