当前位置: 首页 > news >正文

【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)&#xff0c;是把参数 str 所指向的字符串转换为一个整数&#xff08;int类型&#xff09;的库函数。 使用场景 引子&#xff1a; 有兴趣的朋友可以听我逐句翻译一下cpluscplus.com里的这段解释&#xff08;要考六级了练一下&#xff09;&#xff1a; …...

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…...

充电宝哪款好用?什么牌子充电宝耐用?充电宝选购要点总结

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

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…...

使用docker部署项目

一、docker私有镜像仓库 1、docker私有镜像仓库 库&#xff08;Repository&#xff09;是集中存放镜像的地方&#xff0c;又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候&#xff0c;它实际上是从registry.docker.com这个地址去查找&#xff0c;这就是Docker公…...

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测

目前现状 无法客观、方便地掌握护林员的到位情况&#xff0c;因而无法有效地保证巡护人员按计划要求&#xff0c;按时按周期对所负责的林区开展巡护&#xff0c;使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理&#xff0c;现场状况、位置等信息描述…...

【最优化方法】实验三 无约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生进一步熟悉掌握使用MATLAB软件&#xff0c;并能利用该软件进行无约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、最速下降法的MATLAB实现 &#xff12;、牛顿法的MATLAB实现 &#xff13;、共轭梯度法的MATLAB…...

kafka-偏移量图解

生产者偏移量&#xff1a;生产者发送消息时写入到哪个位置&#xff08;主题的每个分区会存储一个 leo 即将写入消息的偏移量&#xff09;&#xff0c;每次写完消息 leo 会 1 消费者偏移量&#xff1a;消费者从哪个位置开始消费消息&#xff0c;小于等于 leo&#xff0c;每个组…...

内网安全--隧道技术-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、知识点 弱比较&#xff0c;强比较、数组绕过、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 阿呆得到最高指示&#xff0c;如果还出问题&#xff0c;就卷铺盖滚蛋&#xff0c;阿呆心在流血。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\…...

ABAP WRITE换行输出

不换行&#xff1a; write hello world!. write 春天马上就到了!. 换行&#xff1a; write hello world!. write /春天马上就到了!. 换行的第二种&#xff1a; write: hello world! ,/,春天马上就到了!....

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地&#xff0c; 我刚开始用的nodejs14报错&#xff0c; 后面换成nodejs16&#xff0c;启动前端成功了。 页面如下图所示...

python-数据可视化(总)

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

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车&#xff0c;然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例&#xff1a; 3、继续回车&#xff0c;然后会看到以下字眼 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元件及基本作用域

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

GB-T 43696-2024 网络安全技术 零信任参考体系架构

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

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...