前些日子看《剑指offer》提到关于如何实现字符串到整形的转换,本想当然很简单啊,可能大家都能够想到的,原code如下:
int StrToInt(char * string)
{
int number = 0;
while*string != '\0')
{
number = number * 10 + (*string - '\0');
string++;
}
return number;
}
简单吧,但是这样的代码将会是漏洞百出的,转换为整形有很多可能的因素要考虑:
1. 若字符串为空怎么处理;
2. 可能存在非 0~9的数字未考虑到;
3. 若包含正负号怎么考虑;
4. 字符串前面可能还有一些空格。
还有针对于atoi库函数,通过一个全局变量进行字符串为空的非法输入情况,这种情况函数本身会返回0,还需要设置全局变量做一个非法的特殊标记,主要用以区分到底是非法的输入得到的结果0还是原来数据得到的结果0。有兴趣的朋友可以研究一下atoi 源码
在这贴上自己写的代码,请大家指点不足之处:
#include<stdio.h>
#include<stdlib.h>
int valid = 1; //定义全局变量,判断输入的字符串是否为空
int myatoi(const char *s);
int main(int argc, char *argv[])
{
char * pchar = " -1000.... ";
/*
int a = atoi(pchar);
printf("atoi: %d\n", a);
*/
int b = myatoi(pchar);
if(valid == 0) {
printf("数据转换失败");
}
else
{
printf("myatoi: %d\n",b);
}
return 0;
}
int myatoi(const char *s)
{
int res = 0;
int flag = 1; //正负号标志
const char * p = s;
if(s == NULL)
{
valid = 0; //不合法
return 0;
}
//去掉空格号
while(*p != '\0' && *p == ' ')
{
p++;
}
if(*p == '\0') //如果去掉空格后该字符串变为 "", 则返回0, 虽然说并不是真的为0,但经过原始atoi转换同样为0,故先这样处理
return 0;
if( *p == '+') flag = 1;
if(*p == '-') flag = -1;
p++;
while(*p != '\0' && *p != ' ')
{
if(*p <= '9' && *p >= '0') {
res = res * 10 + (*p - '0');
}
else {
break;
}
p++;
}
if(res != 0) return (res * flag);
return 0;
}
那么实现atol的原理就一样了,不过atof较为难一些,要考虑到更多的因素,比如小数点,指数E(e)等。