彻底理解C语言中的atoi函数:从基础到实现
创作时间:
作者:
@小白创作中心
彻底理解C语言中的atoi函数:从基础到实现
引用
CSDN
1.
https://blog.csdn.net/2302_80198073/article/details/136986260
在学习C语言的时候,我们知道每个字符都有其所对应的ASCII码值,当我们使用49来打印字符时,打印出来的就是数字字符 '1',那么字符能否直接被转换成对应的整型数字呢?答案是当然可以,这时我们就需要使用atoi函数。
atoi函数的作用
先看一下官网对atoi函数的解释:
解释如下:
- 参数:str -- 要转换为整数的字符串。
- 返回值:该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
即把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
atoi函数的基本使用方法
我们直接使用实例来进行讲解:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = "-54321";
int ret = atoi(str);
printf("%d", ret);
return 0;
}
从上面的例子我们可以看出atoi函数将字符串 " -54321 " 转换成了整数 -54321,实现了将字符串直接转换成整型数据的操作,这也就是atoi函数的作用。
但是使用atoi函数还有几点使用细节需要注意:
atoi函数的使用细节:
- 使用atoi函数需要包含<stdlib.h>头文件;
- 当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0;
- atoi函数会自动过滤开始时的空白字符;
- atoi函数会根据字符串内容自动判断整数的正负;
- 当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值;
- 当字符串中的数字有非10进制字符隔断时,atoi函数会直接返回当前位置前面的数字;
现对第2条、第3条、第5条、第6条进行实例演示:
第2条:当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = "241";
int ret = atoi(NULL);
printf("%d", ret);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = "";
int ret = atoi(str);
printf("%d", ret);
return 0;
}
第3条:atoi函数会自动过滤开始时的空白字符
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = " -54321";
int ret = atoi(str);
printf("%d", ret);
return 0;
}
第5条:当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = "238947283649234";
int ret = atoi(str);
printf("%d", ret);
return 0;
}
第6条:当字符串中的数字有非10进制字符隔断时,atoi函数会直接返回当前位置前面的数字
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = "-543abc21";
int ret = atoi(str);
printf("%d", ret);
return 0;
}
以上我们就了解了atoi函数的基本使用方法。
如何自我实现atoi函数
在自我实现atoi函数之前,让我们来梳理一下实现atoi函数的思路:
- 需要一开始就对参数进行判断,如果是NULL指针,则返回0,如果是空字符串则返回0
- 然后开始过滤字符串开始时的空白字符
- 判断字符串中的整型数据是正还是负
- 开始读取字符串中的整型数据直到遇到第一个非10进制字符
接下来看一下如何自我实现atoi函数:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int myAtoi(const char * str)
{
//判断是否是NULL指针或空白字符串
if (str == NULL)
return 0;
if (str == '\0')
return 0;
//过滤空白字符
while (isspace(*str))
{
str++;
}
//使用标志flag来判断数字正负
int flag = 1;
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
//由于字符串里的数字可能大于int类型的最大值,所以使用long long类型变量记录数据
long long ret = 0;
while (*str != '\0')
{
//如果是10进制数据
if (isdigit(*str))
{
ret = ret * 10 + (*str - '0') * flag;
str++;
if (ret > INT_MAX)
ret = INT_MAX;
if (ret < INT_MIN)
ret = INT_MIN;
}
//如果不是10进制数据
else
{
//由于atoi函数返回值为int类型,而刚才定义的变量是long long类型,所以要进行转换
return (int)ret;
}
}
return (int)ret;
}
上面代码中,每一个关键步骤都进行了解释,可以帮助读者更好的理解代码的实现!
热门推荐
李安新片《李小龙》剧本已完成 有望2025年开机!
李安回归传统电影制作:3D技术探索遇挫,新李小龙传记片将回归传统
尿糖4+是什么意思?解读其健康影响与应对方法
如何确保网盘使用的安全性?
计算机系列之输入输出、中断、总线、可靠性、操作系统、进程管理、同步互斥
磨玻璃结节要观察几年?医生给出专业建议
提前批与普通批区别在哪?录取顺序谁先谁后?
深圳崛起:未来全球经济中心已初见端倪?
预防肾结石的关键因素:饮食、运动与水分摄入的综合影响
9张色彩心理学插画:破解你最爱颜色的玄机!
“汽车燃料消耗量”新规发布,燃油车马上要消失了?想错了!
黄杨常见病害及防治方法
基拉·大和驾驶过的多款机体回顾
钓鲫鱼金袖好还是赤袖好?几乎没有区别,两种钩都适合钓鲫鱼!
千又鱼钩的优点和缺点,搞清楚优缺点,钓鱼时才能扬长避短!
玻璃体后脱离有哪些症状
宁波"恰如家"为脊髓损伤者打造康复平台 帮助更多肢残人士"站起来"
小腿骨折术后多久可以拄拐?医生给出详细解答
如何根据考研大纲高效复习?
智能创新赋能疾控网络:2024年科技助力疾病防控新突破
一年级数学必考:含多余条件的应用题,怎么理解才不出错?
电子元器件与电路之-电容的介绍和作用
2025蛇年游戏攻略:鲁班七号肉装出装指南
如何正确泡发人造木耳及安全食用时间指南
沙漠玫瑰的修剪方法,掌握这几招,让它美到惊艳!
翡翠颜色价值排行:全面对照、顺序与评定
如何根据自身优势规划长期职业目标
35 种秋季发色创意:今年秋天值得尝试的令人惊叹的色调
厨房燃气热水器的使用指南(安全高效的热水器使用方法)
脂溢性皮炎怎么治疗才能彻底除根