1. 写了一个简单的atoi的实现,bug不少。贴出来以正视自己的错误。

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <math.h>  
  5.  
  6. int my_atoi(char *s)  
  7. {  
  8.     char *str;  
  9.     int len=0;  
  10.     _int64 ll=0;  //必须要初始化,否则输出不正确  
  11.     int inte=0;  
  12.     int i,j,temp;  
  13.     str=s;  
  14.     len=strlen(s);  
  15.       
  16.     for(i=0;i<len;i++)  
  17.     {         
  18.         temp=str[i]-'0';  
  19.         for(j=i;j<len-1;j++)  
  20.             temp*=10;  
  21.         ll+=temp;  
  22.     }  
  23.     if(ll>(pow(2,32)-1))  
  24.         printf("输入的数过大,请重新输入\n");  
  25.     else 
  26.         inte=ll;  
  27.     return inte;  
  28. }  
  29.  
  30. int main(void)  
  31. {  
  32.     char s[32];  
  33.  
  34.     printf("输入小于32位整数\n");  
  35.     scanf("%s",s);  
  36.     printf("输入整数为:%d\n",my_atoi(s));  
  37.     return 0;  
  38. }  
  39.  

参考:http://blog.sina.com.cn/s/blog_6ae0e83c0100mj45.html

2. 实现函数long simple_strtol(const char* cp, unsigned int base),功能是将字符串转化为数字,如"1234"-> 1234。如果base为0,则从字符串cp中判断输入的数为8进制、10进制或者16进制,否则,则使用base进制进行转化。

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <ctype.h>  
  4. long simple_strtol(const char* cp,unsigned int base)  
  5. {  
  6.     const char* p=cp;  
  7.     int res=0;  //局部变量一定要初始化  
  8.     int flag=1,value=0;  
  9.     if(strncmp(p,"-",1)==0)  
  10.     {  
  11.         p++;  
  12.         flag=-1;  
  13.     }  
  14. //  if(base==0) //不需加此句,否则simple_strtol("-012",10);时出现bug  
  15. //  {  
  16.         if(strncmp(p,"0",1)==0)  
  17.         {  
  18.             base=8;  
  19.             p++;  
  20.         }  
  21.         else if(strncmp(p,"0x",2)==0)  
  22.         {  
  23.             base=16;  
  24.             p=p+2;  
  25.         }  
  26.         else 
  27.             base=10;  
  28. //  }  
  29.     //printf("%d\n",*p);  
  30.     while(isxdigit(*p))  //判断是否是十六进制数:0~9或A~F
  31.     {  
  32.         value=isdigit(*p)?(*p-'0'):toupper(*p)-'A'+10;  
  33.         //printf("value=%d\n",value);  
  34.         res=value+res*base;  
  35.         //printf("res=%d\n",res);  
  36.         p++;  
  37.     }  
  38.  
  39.     return (res*flag);  
  40. }  
  41.  
  42. int main(void)  
  43. {  
  44.     long int res;  
  45.     res=simple_strtol("-012",10);  
  46.     printf("%d\n",res);   
  47.     return 0;