字符串转换为整数需要考虑很多种情况,如下:
第一种情况:空指针
第二种情况:空字符串
第三种情况:空白字符
第四种情况:中间有字母的
int main()
{
char* p = "123a45";
int num = atoi(p);
printf("%d\n", num);
system("pause");
return 0;
}
atoi()函数遇见a就自动停下来了,输出123
第五种情况:前面有符号的
int main()
{
char* p = "-12345";
int num = atoi(p);
printf("%d\n", num);
system("pause");
return 0;
}
输出-12345
第六种情况:前面有空格
int main()
{
char* p = " 12345";
int num = atoi(p);
printf("%d\n", num);
system("pause");
return 0;
}
输出12345
第七种情况:数字很长
int main()
{
char* p = "111111111111111111111111111111";
int num = atoi(p);
printf("%d\n", num);
system("pause");
return 0;
}
这样会溢出,输出整形所能表达的最大数2147483647,负数也是会溢出,加负号输出-2147483647
其实就是相当于模拟实现atoi()
#include <stdio.h>
#include <stdlib.h>#include <assert.h>
#include <string.h>
enum Status//枚举两个状态
{
VALID,//合法
INVALID//非法
};
enum Status status = INVALID;//定义一个status初始化为非法,因为合法的情况比较少,后面遇到合法的置合法即可,代码简单
int my_atoi(const char* str)
{
int flag = 1;
long long ret = 0;
//1、空指针
assert(str != NULL);//空指针的处理
//2、空字符串
if (*str == "\0")
{
return 0;//在这里不需要改变status,在下面检测status是非法就是正确的
}
//3、空白字符
while (isspace(*str))
{
str++;//如果是空白字符就跳过去
}
//4、符号‘+’‘-’
if (*str == '-')
{
flag = -1;//上面定义一个flag初始化为1,用来标识,遇到负号就在后面输出的时候乘上-1
str++;//遇见符号记录下负号就跳过去
}
if (*str == '+')
{
str++;//正号不需要管,直接跳过去
}
//5、正常字符
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 + flag*(*str - '0');//(这里解释请忽略flag*)如果是数字字符,例如12345,ret=ret*10+'1'-'0',ret为0,
//第一次ret=1,接下来ret=1*10+'2'-'0',结果为12,依次往后遇到\0停止,即可得出12345
//6、判断溢出
if ((ret > INT_MAX) || (ret < INT_MIN))//这里ret是int型的话,不会超过最大或者最小,所以置ret为long long型
{
//为了考虑负越界,上面得到的ret也需要成为负数,乘以flag即可
if (flag == 1)
{
return INT_MAX;
}
else
{
return INT_MIN;
}
}
}
else
{
return (int)ret;//ret强转一下才可以返回
}
str++;
}
status = VALID;//置为合法就可以输出了
//return ret*flag;//如果前面遇到负号也不担心输出错误
return (int)ret;//上面已经乘以flag了,这里就不需要乘了
}
int main()
{
char* p = "12345";
int num = my_atoi(p);
printf("%d\n", num);
system("pause");
return 0;
}