atoi是C语言中常见的函数。大家可能对于他不太熟悉,其主要还是因为学校可能没有讲到。其实有很多函数像atol、atof都是一样的,本篇文章以atoi为例,剩余大家如果感兴趣可以再去了解。
目录
1.函数介绍
cpp
int atoi (const char * str);
功能:
1.解析字符串的内容,将字符串转化成整数
2.atoi的使用需要包含头文件<stdlib.h>
参数:
str:指针,指向了待转化的字符串
返回值:
转化成功的话,返回转化得到的整数,如果是空字符串或者是跳过空白字符后第一个不是数字字符将返回0,如果转化得到数字超出int的取值范围,则是未定义的行为。
2.代码演示
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", atoi(" "));
printf("%d\n", atoi(" abc"));
printf("%d\n", atoi("123"));
printf("%d\n", atoi(" 123"));
printf("%d\n", atoi(" +123"));
printf("%d\n", atoi(" -123"));
printf("%d\n", atoi(" -123abc"));
printf("%d\n", atoi("111111111111111111111111111"));//行为未定义
return 0;
}
输出结果:VS2022
cpp
0
0
123
123
123
-123
-123
2147483647
3.atoi函数的模拟实现
atoi函数的模拟实现可能有些复杂,但一定要理清思路:要先跳过空白字符,再看有无+-,如果有还需考虑最后的符号,用flag记录;同时ret值不能大于最大,也不能小于最小。
cpp
int my_atoi(const char* str)
{
//跳过空白字符
while (isspace(*str))
str++;
//判断正负符号
int flag = 1;
if (*str == '+')
{
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
//用ret记录值
long ret = 0;
while (*str != '\0')
{
//判断是否是数字字符
if (isdigit(*str))
{
//转化为整型,如'1'-'0'=1
ret = ret * 10 + (*str - '0') * flag;
//最大只能INT_MAX,最小只能INT_MIN
if (ret > INT_MAX)
{
ret = INT_MAX;
}
else if (ret < INT_MIN)
{
ret = INT_MIN;
}
}
else
return (int)ret;
str++;
}
return (int)ret;
}
4.扩展
其实还有两个函数可以了解一下:
1.atol:将字符串转换成long类型,转换的范围是比atoi要更大一些。
2.strtol:将字符串转换成long类型,这个函数更加复杂,可以按照各种进制转换。
可以扩展学习一下。