【C语言】atoi函数的使用及模拟实现
atoi (ascii to integer),是把参数 str 所指向的字符串转换为一个整数(int类型)的库函数。
使用场景
引子:
有兴趣的朋友可以听我逐句翻译一下cpluscplus.com里的这段解释(要考六级了练一下):
将字符串转换为整型
解析C-字符串str,将它的所含物解释为一个整数,将这个整数作为int类型的值返回。
这个函数首先丢弃必要数量的空白字符(像isspace),直到第一个非空白字符被找到。然后,从这个字符开始,接受一个可选的初始正号或负号,后面跟着尽可能多的十进制数字,并将它们解释为数字值。
这个字符串能够在组成整数的字符后面容纳额外的字符,这些字符会被忽略且对这个函数的行为没有影响。
如果str中非空白字符的第一个序列不是一个有效整数,或者这个序列不存在因为str要么是空字符要么只含有空白字符,那就不发生转换并将0作为返回值。
参数
以一个整数形式开始的C-字符串。
返回值
成功情况下,这个函数返回被转换的int类型的整数。
如果被转换的值超出了int能代表的最大范围,会导致未定义的行为。如果有可能的话,可以参阅strtol,以获得更健壮的跨平台替代方案。
atoi函数介绍
头文件
#include<stdlib.h>
原型
int atoi(const char *str)
功能
把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
返回值
返回转换后的整数,如没有执行有效的转换,返回零。
注意
转换时会先跳过前面的空格字符,直到遇上数字或正负符号才开始转换。遇到非数字或'\0',结束转换,并将结果返回。如果第一个字符不是数字,就直接返回0;
使用案例
光说难以理解,写一段代码来感受一下这个函数的使用吧:
#include<stdio.h>
#include<stdlib.h>//atoi需要的头文件
int main()
{char str1[] = "123star123";char str2[] = "star123";char str3[] = " -123";//注意负号char str4[] = "123 456";//注意中间的空白字符int r1 = atoi(str1);int r2 = atoi(str2);int r3 = atoi(str3);int r4 = atoi(str4);printf("%d %d %d %d\n", r1,r2,r3,r4);return 0;
}
而这是我们输出的结果:
而还有更加特殊的情况:
如果给atoi传一个空指针(NULL),会发生下面的情况:
int ret = atoi(NULL);
printf("%d", ret);
程序直接崩溃了。
还有,字符串的数字大小超过了整型数字的取值范围:
可以看到,我们明明给的是2147483648,得到的结果却是2147483647,因为这是int最大能代表的值, 这是因为当字符串的数字大小超过了int类型的取值范围时,这个函数返回时会变为int的最大或最小值。
有了上面这些例子,关于atoi函数,我们可以总结出几个特点:
1.当字符串中的数字被非10进制字符隔开时,atoi函数会返回当前位置之前的数字;
2.atoi函数会根据字符串内容自动判断整数的正负;
3.atoi函数会自动跳过开头的空白字符;
4.当参数传入NULL时会报错;传入空字符串时,返回值为0;
5.当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值;
atoi函数模拟实现
既然我们已经知道了这个函数的实现逻辑,我们就能根据这些实现逻辑,自己写出一个模拟的atoi函数:
#include<stdio.h>
#include<ctype.h>//isspace需要的头文件
#include<stdlib.h>int my_atoi(const char* str)
{if (str == NULL||'\0')//判断str为NULL或空白字符串的特殊情况return 0;while (isspace(*str))//处理开头的空白字符{str++;}int flag = 1;//flag来代表数字正负if (*str == '+'){flag = 1;str++;}else if (*str == '-'){flag = -1;str++;}long long ret = 0;//用long long类型变量来存储字符串数字,因为字符串里的数字可能大于int的最大值while (*str)//*str != '\0'{if (isdigit(*str))//如果这一位是10进制数{ret = ret * 10 + (*str - '0')*flag;str++;if (ret > INT_MAX)return INT_MAX;//如果已经超出int最大范围了,就返回int类型最大值if (ret < INT_MIN)return INT_MIN;//如果已经小于int最大范围了,就返回int类型最小值}else//如果这一位遇到非10进制数就直接返回当前值{return (int)ret;//别忘记强转回int}}return (int)ret;
}
vs运行效果参考:
那么到此,atoi函数的使用和模拟的讲解就结束了,祝阅读愉快。
相关文章:

【C语言】atoi函数的使用及模拟实现
atoi (ascii to integer),是把参数 str 所指向的字符串转换为一个整数(int类型)的库函数。 使用场景 引子: 有兴趣的朋友可以听我逐句翻译一下cpluscplus.com里的这段解释(要考六级了练一下): …...

Golang:使用bndr/gotabulate实现美观的打印表格数据
bndr/gotabulate 可以使用 Go 语言简单、美观的打印表格数据 文档 https://pkg.go.dev/github.com/bndr/gotabulatehttps://github.com/bndr/gotabulate 安装 go get github.com/bndr/gotabulate代码示例 package mainimport ("fmt""github.com/bndr/gotab…...

充电宝哪款好用?什么牌子充电宝耐用?充电宝选购要点总结
随着科技的飞速发展,充电宝已成为现代生活的必备之物。无论是日常通勤、旅行出差,还是在紧急情况下,充电宝都能为我们的电子设备提供可靠的电力支持。然而,面对市场上众多品牌和型号的充电宝,如何选择一款性价比高的充…...

【启程Golang之旅】基本变量与类型讲解
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...

使用docker部署项目
一、docker私有镜像仓库 1、docker私有镜像仓库 库(Repository)是集中存放镜像的地方,又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候,它实际上是从registry.docker.com这个地址去查找,这就是Docker公…...

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测
目前现状 无法客观、方便地掌握护林员的到位情况,因而无法有效地保证巡护人员按计划要求,按时按周期对所负责的林区开展巡护,使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理,现场状况、位置等信息描述…...

【最优化方法】实验三 无约束最优化方法的MATLAB实现
实验的目的和要求:通过本次实验使学生进一步熟悉掌握使用MATLAB软件,并能利用该软件进行无约束最优化方法的计算。 实验内容: 1、最速下降法的MATLAB实现 2、牛顿法的MATLAB实现 3、共轭梯度法的MATLAB…...

kafka-偏移量图解
生产者偏移量:生产者发送消息时写入到哪个位置(主题的每个分区会存储一个 leo 即将写入消息的偏移量),每次写完消息 leo 会 1 消费者偏移量:消费者从哪个位置开始消费消息,小于等于 leo,每个组…...

内网安全--隧道技术-MSF上线本地
免责声明:本文仅做技术交流与学习... 不得不说,小白最近也是用上了viper,这里要特别感谢一下my bro 北岭敲键盘的荒漠猫 MSF--viper: --生成马子-->上线 --进入meterpreter. 1-查看路由,添加路由. 查看路由信息 : run autoroute -p run post/multi/manage/autoroute 添加…...

初识STM32单片机-TIM定时器
初识STM32单片机-TIM定时器 一、定时器概述二、定时器类型2.1 基本定时器(TIM6和TIM7)2.2 通用定时器(TIM2、TIM3、TIM4和TIM5)2.3 高级定时器(TIM1和TIM8) 三、定时中断基本结构和时基单元工作时序3.1 定时器基本结构3.2 预分频器时序3.3 计数器时序3.3.1 计数器有无预装时序(…...

NSSCTF-Web题目3
目录 [BJDCTF 2020]easy_md5 1、知识点 2、题目 3、思路 [ZJCTF 2019]NiZhuanSiWei 1、知识点 2、题目 3、思路 第一层 第二层 第三层 [BJDCTF 2020]easy_md5 1、知识点 弱比较,强比较、数组绕过、MD5加密 2、题目 3、思路 1、首先我们跟着题目输入&a…...

基于Java实现震中附近风景区预警可视化分析实践
目录 前言 一、空间数据说明 1、表结构信息展示 2、空间范围查询 二、Java后台开发实现 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、百公里风景区列表展示 3、风景区列表展示 4、附近风景区展示 四、总结 前言 地震这类…...

【CTF Web】CTFShow web7 Writeup(SQL注入+PHP+进制转换)
web7 1 阿呆得到最高指示,如果还出问题,就卷铺盖滚蛋,阿呆心在流血。 解法 注意到: <!-- flag in id 1000 -->拦截很多种字符,连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\…...

ABAP WRITE换行输出
不换行: write hello world!. write 春天马上就到了!. 换行: write hello world!. write /春天马上就到了!. 换行的第二种: write: hello world! ,/,春天马上就到了!....

VUE3学习第一篇:启动ruoyi
1、找到ruoyi的vue3版本 然后下载代码到本地, 我刚开始用的nodejs14报错, 后面换成nodejs16,启动前端成功了。 页面如下图所示...

python-数据可视化(总)
python-数据可视化 ** 数据可视化 指的是通过可视化表示来探索数据,它与数据挖掘**紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表,也可以是数以吉字节的数据 最流行的工具之一…...

使用git生成SSH公钥,并设置SSH公钥
1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车,然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例: 3、继续回车,然后会看到以下字眼 Enter…...

iPhone win10更改备份路径
1 删掉或改名 旧的Backup, 否则不能连接 ren "C:\Users\Administrator\Apple\MobileSync\Backup" Backup_old 2 在目标盘中 创建新的文件夹 手动创建 MobileSync\Backup 3 链接两个文件夹 mklink /J "C:\Users\Administrator\Apple\MobileSync\Backup" &qu…...

Jmeter元件及基本作用域
🚀从今天开始学习性能测试工具——Jmeter,小梦也是先学习了下Jmeter的元件概念以及其基本的作用域,整理了下笔记,希望不管是从事开发领域还是测试领域的朋友们,我们一起学习下Jmeter工具,提升工作中的技能&…...

GB-T 43696-2024 网络安全技术 零信任参考体系架构
GB-T 43696-2024 网络安全技术 零信任参考体系架构 编写背景 随着网络环境的日益复杂,传统的网络安全策略已经难以满足现代企业的需求。为了应对不断变化的安全威胁,零信任安全模型应运而生。GB-T 43696-2024《网络安全技术 零信任参考体系架构》是中国…...

Java使用apache.poi生成excel插入word中
加油,新时代打工人! 工作需求,上个文章我们生成好的word,这次将生成好的excel表格数据,插入word中。需要准备好excle数据,然后插入到word中。 最后个需要,就是把这些生成好的word文档转成pdf进行…...

斯坦福报告解读3:图解有趣的评估基准(上)
《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika等人员和组织合著,旨在追踪、整理、提炼并可视化与人工智能(AI)相关各类数据,该报告已被大多数媒体及机构…...

C语言---扫雷游戏的实现
1.扫雷游戏的分析和设计 需要创建3个文件夹 test.c----扫雷游戏的测试 game.c----扫雷游戏的实现 game.h----扫雷游戏的实现 雷的信息使用二维数组存放 • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认…...

《征服数据结构》块状链表
摘要: 1,块状链表的介绍 2,块状链表的代码实现(Java和C) 1,块状链表的介绍 前面我们讲过数组和链表,数组具有 O(1)的查询时间,O(N)的删除,O(N)的插入,而链表具…...

leetCode.86. 分隔链表
leetCode.86. 分隔链表 题目思路: 代码 class Solution { public:ListNode* partition(ListNode* head, int x) {auto lh new ListNode(-1), rh new ListNode(-1);auto lt lh, rt rh;for(auto p head; p; p p->next ) {if(p->val < x) {lt lt->…...

Java进阶学习笔记5——Static应用知识:单例设计模式
设计模式: 架构师会使用到设计模式,开发框架,就需要掌握很多设计模式。 在Java基础阶段学习设计模式,将来面试笔试的时候,笔试题目会经常靠到设计模式。 将来会用到设计模式。框架代码中会用到设计模式。 什么是设计…...

Vue 前端加框 给div加红色框框 js实现
实现方式:用getElementsByClassName、createElement、appendChild实现在原有div上添加一个新的div,从而达到框选效果 <template><div><el-button click"addIten">添加</el-button><el-button click"deleteIt…...

Percona Toolkit 神器全攻略(实用类)
Percona Toolkit 神器全攻略(实用类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾Percona Toolkit 神器全攻略 全文约定:$为命令提示符、greatsql>为GreatSQL数据库提示符。在后续阅读中,…...

ARM GIC 和NVIC的区别
ARM GIC(Generic Interrupt Controller)和NVIC(Nested Vectored Interrupt Controller)是两种不同的中断控制器,它们在ARM架构中扮演着重要的角色,但各自有不同的设计和应用场景。 ARM GIC: G…...

CSS文本粒子动画特效之爱心粒子文字特效-Canvas
1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…...