atoi函数的认识
atoi的头文件
<math.h> 或者 <stdlib.h>
返回值和参数
这里函数的返回值是 int 类型的,函数的参数是 字符指针。
atoi的具体解释
-
atoi(s)函数用于把字符串转换成整数,转换后的值不能超出int的表示范围。
-
这个函数会尽可能多的在开头丢弃空格字符,直到遇到第一个非空格的字符,从这个字符开始,如果这个字符是正号或者负号,直接取出这个字符,后面尽可能多的跟随十进制数字,而一旦遇到非整数的字符,直接返回这个字符之前的整数,后面的字符全部放弃,不会对函数造成影响。
-
如果遇到的第一个非空格字符不是一个有效的整数字符,参数指针为空或者仅包含空格字符,这些情况下,不执行转换直接返回0;
代码演示效果
atoi函数的模拟
atoi函数模拟前的问题总结
-
函数传入空指针------------------程序错误
-
函数传入空字符串------------------返回0
-
传入了一个非数字字符--------------------返回0
-
开头有空白符号----------------直接跳过,直到遇到第一个非空白的字符
-
正负号问题-------------------只有第一个非空白的字符为正负号时,才会取这个字符,如果第一个非空白的字符不是正负号,后面遇到的正负号,一律打成非整数字符的其他字符。
-
返回值是整型,所以返回时可能出现的数据溢出问题。----------------如果返回值超出了int类型的最大值,就会造成越界,这时返回 INT_MAX。同时要注意,函数的返回值如果用int储存,那么当返回值超出int类型的最大值时,就会发生截断,就不会显示异常了。
atoi函数模拟代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_atoi(const char* str)
{
//防止传入的是空指针,用assert断言一下。
assert(str);
//如果传入的是空字符串或者仅有空格的字符串,不进行转换,直接返回0
//这里用while找出第一个非空格的字符
while (*str == ' ')
{
str++;
}
//判断第一个非空格的字符是否为 \0 ,\0是字符串的结束标志,如果是'\0',直接返回0。
if (*str == '\0')
{
return 0;
}
//判断第一个非空格字符是否为正负号
int Fuhao = 1;
if (*str == '-')
{
Fuhao = -1;
str++;
}
else if (*str == '+')
{
str++;
}
//判断后面的字符是否为整数字符
long long int num = 0;
while ((*str - 48) >= 0 && (*str - 48) <= 9)
{
num = num * 10 + (*str - 48);
str++;
}
num = num * Fuhao;
// 判断返回值是否溢出
if (num < INT_MIN)
{
return INT_MIN;
}
else if (num > INT_MAX)
{
return INT_MAX;
}
else
{
return (int)num;
}
}
int main()
{
//test
char a1[] = "";
char a2[] = "1111111111111111111111111111111111111111";
char a3[] = "13215das13";
char a4[] = "1358dasd5";
char a5[] = "asd23153";
printf("%d\n", my_atoi(a1));
printf("%d\n", my_atoi(a2));
printf("%d\n", my_atoi(a3));
printf("%d\n", my_atoi(a4));
printf("%d\n", my_atoi(a5));
return 0;
}