【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释
【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释
那么这里博主先安利一下一些干货满满的专栏啦!
作者: #西城s
这是我的主页:#西城s
在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
今天,博主带着大家,一步一步,详细地解剖atoi(字符串转整型)这个函数。
本篇为不收藏必后悔系列篇~

文章目录
atoi()函数原型以及功能介绍
函数原型:
int atoi (const char * str);
函数功能: 将一个字符串转化成一个整型。
使用举例:
所需包含头文件:#include<stdlib.h>

实现思路
看到这里,很多伙伴都会觉得这个函数的实现十分简单:提取每一位,字符转整型就可以了,其实不然。因为我们传进去的字符串是很多样的,我们有非常多的情况需要考虑。
需要考虑的问题:
- 空指针问题
- 空字符串问题
- 非数字字符
- 空白字符,逗号字符等
- 正负号
这里其实知识一部分,其实,我们通过www.cplusplus.com搜索这个函数,也就是上面那张原型图我们可知,还有许多问题要处理,博主今天就带着大家处理以上五个问题。细节方面我们看代码注释就可以了,已经十分详细了,如果还有不明白的地方,可以私信博主噢。
实现代码
//模拟实现atoi
//将字符串转化成整型
#if 1
#include<assert.h>
enum Status {
VALID,INVALID
}status=INVALID;//先一开始设置成非法
int my_atoi(const char* str) {
//空指针
assert(str);
int flag = 1;//表示是正数
//空字符串
if (*str == '\0') {
//发现这样返回无论怎样都不合适,所以我们设置一个变量
//判断当前返回值是否有效,合法还是非法
//使用枚举
return 0;
}
//处理空白字符
while (isspace(*str)) {
//如果是空白字符,就跳过去了
str++;
}
//正负号
if (*str == '-') {
flag = -flag;//有一个'-'变一次号
str++;
}
//遍历串
long long n = 0;
while (*str) {
if (isdigit(*str)) {
n = n * 10 + (flag) * (*str - '0');
if (n<INT_MIN || n>INT_MAX) {//说明越界了
//但是,如果存到n里面去,是肯定不会越界的,因为会发生截断
//所以,设置成long long是最好的
n = 0;
break;
}
}
else {
n = 0;
break;
}
str++;
}
if (*str == '\0') {
status = VALID;
}
return (int)n;
}
//1.空指针问题
//2.空字符串问题
//3.非数字字符
//4.空白字符等,逗号字符
//5.正负号
int main() {
while (1) {//重复测试
char arr[100] = { 0 };
gets(arr);
int ret = my_atoi(arr);
if (status == VALID)
printf("%d\n", ret);
else
printf("%d err\n", ret);
}
return 0;
}
#endif

尾声
相信看到这里,大家已经对atoi()函数的模拟实现已经有了一定了解了,如果你感觉这篇博客对你有帮助的话,不要忘了一键三连支持一下再离开噢!
【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释的更多相关文章
- 【C语言】模拟实现atoi函数
atoi(表示 ascii to integer)是把字符串转换成整型数的一个函数. atoi()函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( ...
- 【c语言】 模拟实现库函数的atoi函数
// 模拟实现库函数的atoi函数 #include <stdio.h> #include <string.h> #include <assert.h> #incl ...
- c语言实现atoi和itoa函数。
首先看atoi函数: C语言库函数名: atoi 功 能: 把字符串转换成整型数. 名字来源:ASCII to integer 的缩写. 原型: int atoi(const char *nptr); ...
- C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现
tfref 前言 C++对象的内存布局 只有数据成员的对象 没有虚函数的对象 拥有仅一个虚函数的对象 拥有多个虚函数的对象 单继承且本身不存在虚函数的继承类的内存布局 本身不存在虚函数(不严谨)但存在 ...
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)
1.int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明. ● itoa():将 ...
- C语言itoa()函数和atoi()函数详解(整数转字符)
http://c.biancheng.net/cpp/html/792.html C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. 以下是用itoa()函数将整 ...
- C语言itoa函数和atoi 函数
C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转 换为字符串的一个例子: # include <stdio.h> ...
- [置顶]
C语言itoa()函数和atoi()函数详解(整数转字符C实现)
头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * str); [函数说明]ato ...
- 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)
本文转自: C语言itoa()函数和atoi()函数详解(整数转字符C实现) 介绍 C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. int/float to ...
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)【转载】
文章转载自https://www.cnblogs.com/bluestorm/p/3168719.html C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. ...
随机推荐
- AtCoder Beginner Contest 210 (A~E)
比赛链接:Here A - Cabbages 略 B - Bouzu Mekuri 略 C - Colorful Candies 用map维护连续一段区间的不同元素即可. int main() { c ...
- Spring相关原理
Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.常见的配置方式有三种:基于XML的配置.基于注解的配置.基于Java的配置. 模块分为以下:Spring Core:Spring ...
- 2.5D 组态案例合集 | 智慧园区、数据中心、SMT 生产线、汽车制造
在阅读文章之前,大家可以思考下 2.5D 设计属于哪种界定? 2.5D 是通过二维的元素来呈现出三维的效果.其实在国外并没有 2.5D 这样的称呼,标准说法是 Isometric 风格,翻译过来就是等 ...
- 【调试】GDB使用总结
启动 在shell下敲gdb命令即可启动gdb,启动后会显示下述信息,出现gdb提示符. ➜ example gdb GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Cop ...
- P1228-递归【黄】
这道大递归我一开始就找对了方向,不过了MLE,然后从网上搜索到了一个贼有用的概念--尾递归,即如果递归的下一句就是return且没有返回值或者返回值不含有递归函数则编译器会做优化,不会压入新的函数而是 ...
- P1616-DP【橙】
这道题好几天前就写出了记搜代码,但是理论上空间恰好够,实际上不论是用new-delete还是malloc-free,都有1~2个点MLE了(最抽象的是一开始MLE两个点,我把数组两个下标调换顺序后理应 ...
- docker 原理之 user namespace(下)
1. user namespace user namespace 主要隔离了安全相关的标识符和属性,包括用户 ID,用户组 ID,key 和 capabilities 等.同样一个用户 id 在不同 ...
- docker查看日志:docker service logs 与 docker container logs
转载请注明出处: docker service logs 和 docker container logs 是两个不同的命令,用于查看 Docker 服务和容器的日志.以下是它们之间的区别: 1.doc ...
- for-each循环使用iterator进行遍历
示例如下: public static void main(String args[]) { List list = new LinkedList(); list.add("aa" ...
- 【转帖】FIO磁盘性能测试工具
https://www.jianshu.com/p/70b8c7d5d217 FIO工具介绍 FIO 工具是一款用于测试硬件存储性能的辅助工具,兼具灵活性.可靠性从而从众多性能测试工具中脱颖而出.磁盘 ...
