atoi的函数功能:将string所指向数字字符串转化为整数
1、会跳过前面的空白字符(例如空格,tab缩进)等。
2、如果不能转换成 int 或者为空字符串,那么将返回 0 。特别注意,该函数要求被转换的字符串是按十进制数理解的。
3、atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1
atoi对应头文件为
针对上述实例应用输出结果,可以总结出以下几种情形:
1、参数为空指针
2、为空字符串
3、含有正负号
4、含有空格
5、含有非数字字符
6、溢出问题
基本思路:
#include
#include
#include
#include
enum Status
{
inlegal,
legal
}status;
//定义一个枚举类型来判断是合法还是非法,区分空字符串返回0,还是合法返回0
int my_atoi(char* str)
{
status = inlegal;
long long ret = 0;
int sign = 1;
assert(str);///断言处理,判断是否为空指针
if (*str == '\0')//判断是否是空字符串
{
return 0;//返回非法 0
}
while (*str == ' ')//当遇到空格时
{
str++;//跳至下一位
}
if (*str == '+')
{
sign = 1;
str++;//跳至下一位
}
else if (*str == '-')
{
sign = -1;
str++;//跳至下一位
}
while (*str)//'\0’之前
{
if ((isdigit(*str)))//disigit-->判断是否为数字字符函数
{
ret = ret * 10 + sign * (*str-'0');
//数字字符转化为数字
}
if (ret > INT_MAX)//如果ret为int型,则一定小于INT_MAX
{
return INT_MAX;
}
else if (ret < INT_MIN)
{
return INT_MIN;
}
if (!(isdigit(*str)))
{
return ret;
}
str++;
}
//跳出while循环,遇到'\0'
status = legal;
return ret;
}
int main()
{
char arr[] = "-12839#9210";
int ret = my_atoi(arr);
if (status == inlegal)
{
printf("是非法数字字符串,%d\n", ret);
}
else if (status == legal)
{
printf("是合法数字字符串,%d\n", ret);
}
return 0;
}