atoi函数功能及模拟实现
在前面我们学习了字符函数,字符串函数和内存函数,今天我们来了解atoi函数
1. 解析atoi函数
使用atoi函数需包含头文件stdlib.h
1.1 atoi函数原型:
由此可知,atoi函数接收const char*类型,返回整型
1.2 atoi函数的功能
atoi函数用于将字符数字转化为整型数字
atoi接收一个常量字符串的首地址
-
如果首地址是空格符,丢弃空格符,str不断++,直到遇到非空格符;如果首地址不是空格符,则跳过第1步
-
判断str此时指向字符是什么类型,如果是+、-、数字字符,则str++,继续向后识别,直至遇到其他类型(包括空白字符),返回前面所识别的+、-、数字字符;如果是其他类型(包括空白字符),则直接返回0
注:
-
空白字符的“丢弃”只存在于第一步,后面不再“丢弃”空白字符
-
如果转换后的值超出int类型可表示值的范围,它会导致未定义的行为
例如:
- 传入" 123abc" , 返回123
- 传入’'+123abc",返回123
- 传入"-123abc",返回-123
- 传入" 123 456",返回123
- 传入" abc+123",返回0
- 传入"",即空字符串,返回0
2. atoi函数的模拟实现
根据atoi函数的原型和功能,我们可以写出下面的代码来模拟实现atoi函数!
代码如下:
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <ctype.h>
int my_atoi(const char* str)
{
//空指针
assert(str);
//空字符串
//if (*str == '\0')
// return 0;
//空格符
while (isspace(*str))
{
str++;
}
//+ -
int sign = 1;//+或-都需要使sign等于1,因此需将sign初始化为1
if (*str == '+')
{
str++;
}
else //if(*str == '-')//这里只能用else if,而不能用else,因为此时的str也有可能是其他字符
{
sign = -1;
str++;
}
long long n = 0;
while (isdigit(*str))
{
int num = *str - '0';
n = n * 10 + sign * num;
str++;
if (n > INT_MAX || n < INT_MIN)
return 0;
}
return (int)n;
}
int main()
{
const char* str = "-123abc";
int ret = my_atoi(str);
printf("%d\n", ret);
return 0;
}
注: 这里用到了两个字符函数,详情请见:C语言之字符函数和字符串函数
参考文章:atoi函数和itoa函数以及模拟使用