1. 写了一个简单的atoi的实现,bug不少。贴出来以正视自己的错误。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- int my_atoi(char *s)
- {
- char *str;
- int len=0;
- _int64 ll=0; //必须要初始化,否则输出不正确
- int inte=0;
- int i,j,temp;
- str=s;
- len=strlen(s);
- for(i=0;i<len;i++)
- {
- temp=str[i]-'0';
- for(j=i;j<len-1;j++)
- temp*=10;
- ll+=temp;
- }
- if(ll>(pow(2,32)-1))
- printf("输入的数过大,请重新输入\n");
- else
- inte=ll;
- return inte;
- }
- int main(void)
- {
- char s[32];
- printf("输入小于32位整数\n");
- scanf("%s",s);
- printf("输入整数为:%d\n",my_atoi(s));
- return 0;
- }
参考: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进制进行转化。
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- long simple_strtol(const char* cp,unsigned int base)
- {
- const char* p=cp;
- int res=0; //局部变量一定要初始化
- int flag=1,value=0;
- if(strncmp(p,"-",1)==0)
- {
- p++;
- flag=-1;
- }
- // if(base==0) //不需加此句,否则simple_strtol("-012",10);时出现bug
- // {
- if(strncmp(p,"0",1)==0)
- {
- base=8;
- p++;
- }
- else if(strncmp(p,"0x",2)==0)
- {
- base=16;
- p=p+2;
- }
- else
- base=10;
- // }
- //printf("%d\n",*p);
- while(isxdigit(*p)) //判断是否是十六进制数:0~9或A~F
- {
- value=isdigit(*p)?(*p-'0'):toupper(*p)-'A'+10;
- //printf("value=%d\n",value);
- res=value+res*base;
- //printf("res=%d\n",res);
- p++;
- }
- return (res*flag);
- }
- int main(void)
- {
- long int res;
- res=simple_strtol("-012",10);
- printf("%d\n",res);
- return 0;
- }