要想让字符串转换为整型大家可能觉得很简单,直接一个循环,然后num=num*10+(*str-'0');就OK,但其实并不是这样,我们要考虑它的多种可能会产生的情况,如下
- “12345”正常情况,可以用上式循环的到想要的结果
- “+12345”和“-12345”,带有符号位的情况
- “abcd1234”,带有特殊字符的情况
- “”,字符串内部什么都没有的情况
- 字符串不存在的情况
- “1234567890012345567”,值远远超过int的最大范围的情况
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<limits.h>
enum State
{
INVALID,//0
VALID,//1
};
enum State state = INVALID;
int my_atoi(char *str)
{
int flag = 1;//标志位,标志是正数还是负数
long long int ret = 0;
assert(NULL != str);
if(*str == '+')
{
++str;
}
if(*str == '-')
{
flag = -1;
++str;
}
if(*str == '\0')
{
return 0;
}
while(*str)
{
if(isdigit(*str))
{
ret = ret*10+(*str-'0')*flag;
if(ret>INT_MAX||ret<INT_MIN)
{
return (int)ret;
}
++str;
}
else
{
break;
}
}
if(*str == '\0')
{
state = VALID;
}
return ret;
}
int main()
{
int ret = my_atoi("123");
return 0;
}