C语言之atoi函数的使用和模拟实现

C语言之atoi函数的使用和模拟实现

1. atoi函数介绍

函数声明如下:

int atoi (const char * str);

atoi是用来将字符串中第一次出现的数字字符,转为一个整数

  1. 跳过空白字符,(空白字符包括:空格 ’ ’ ,换页 ’ \f ’ ,换行 ’ \n ’ ,回车’ \r ’ ,制表符 ’ \t ’ 以及 垂直制表符 ’ \v’ ),直到找到一个非空字符
  2. 第一次出现非空字符,如果为字符,则返回值为0,如果为数字,则将这一串数字以整型返回,并且判断是否有正负字符

2. atoi函数的使用

#include <stdio.h>
#include <stdlib.h>  //使用atoi函数需包含的头文件int main()
{char arr[] = "   \n \t 123abcde123";int ret = atoi(arr);printf("%d", ret);return 0;
}

代码运行结果:>
123

3. atoi函数的模拟实现

int atoi (const char * str);

仿照原函数声明来写一个自己的atoi函数

  1. 判断传入的第一个字符是否为空白字符,如果是则跳过,直到找到第一个非空字符
  2. 判断是否有正负号,如果有则记录并跳过
  3. 判断是否为字符字母,如果为字符则返回0,
  4. 如果为字符数字,则将其到字母前的数转换为整型并返回

前三步很容易实现,只需用if来判断即可
重要的是如何将字符数字转换为整数

1ab2 其中只有一个数字,字符数字减去字符0 即 **‘0’**既可以得到整型数字,直接将这个值返回就可以了

12ab12 其中有两个数字,字符1减去字符0,得到1,此时要将1移动到十位,也就是乘以10,得到10,再加上字符2减去字符0,得到12并返回

123ab123 其中有三个数字,字符1减去字符0,得到1,此时要将1移动到十位,也就是乘以10,得到10,再加上字符2减去字符0,得到12,将1移动到百位,再乘以10,得到120,再加上字符3减去字符0,得到123并返回

也就是说一次计算一个字符数字,先将其转化为整型数字,下一次乘以10再加上转化的整型数字就可以

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>int my_atoi(const char* str)
{assert(str); //assert断言 判断是否为空指针int num = 0;  //记录转换之后的值int sign = 1; //假设为整数,如果下面判断中出现负号,则sign = 0while (isspace(*str)) //isspace判断是否为空白字符,如果是则为真,不是则为假{str++;  //跳过空白字符}if (isalpha(*str)) //判断是否为字母,为字母则返回0{return 0;}else{if (*str == '-') //判断正负号{sign = -1; str++;  //跳过负号}while (isdigit(*str))  //isdigit判断是否为数字{num = num * 10 + *str - '0'; //将字符数字转为整型数字并相加str++; //找到下一个字符}return num * sign; //将记录的值 乘以 正/负号 并返回}}int main()
{char arr[] = " \n \t \n 123aweasda a";printf("%d", my_atoi(arr) );return 0;
}

运行结果如下:>
123

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我叫:基数排序【JAVA】

1.自我介绍 基数排序(radix sort)属于“分配式排序” (distribution sort)&#xff0c;又称“桶子法” (bucket sort)或bin sort,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,是‘桶排序’的扩展 2.基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数…

docker start一个容器之后,怎么进入这个容器界面

要进入已经启动的 docker 容器的交互式终端&#xff0c;可以使用 docker exec 命令。这个命令可用于在运行中的容器内部执行命令或脚本&#xff0c;并以交互模式与容器进行交互&#xff0c;具体格式如下&#xff1a; # docker exec -it [container_id or container_name] /bin/…

专业的调查问卷平台推荐:提升数据收集与分析效率

无论是学生还是职场人士&#xff0c;想做好一份调查问卷&#xff0c;关键先要确定调查的主题&#xff0c;然后确定调查人群&#xff0c;编辑问题&#xff0c;最后能够尽可能的美化问卷调查的主题。 想要做到这几点&#xff0c;就要要求问卷调查平台: 1、能够帮助你快速制作出一…

【开题报告】基于模糊控制的花卉光照时间控制系统

题 目 基于模糊控制的花卉光照时间控制系统 一、研究目的和意义 用光电传感器检测自然光&#xff0c;根据花卉开花时长&#xff0c;用MATLAB软件&#xff0c;使用模糊控制算法&#xff0c;对测得数据进行分析&#xff0c;得出结论&#xff0c;并传回下位机控制电机运动…

软件测试测试文档的编写和阅读

在软件测试中的流程中&#xff0c;测试文档也是一个重要的流程&#xff0c;所以测试人员也需要学习测试文档的编写和阅读。 一、定义&#xff1a; 测试文档&#xff08;Testing Documentation&#xff09;记录和描述了整个测试流程&#xff0c;它是整个测试活动中非常重要的文…

QT应用示例

一个简单的QT应用示例&#xff1a;创建一个窗口程序。 首先&#xff0c;确保已经安装了Qt开发环境。接下来&#xff0c;按照以下步骤创建一个简单的窗口程序&#xff1a; 1. 打开Qt Creator&#xff0c;点击“新建文件或项目”。 2. 选择“应用程序”&#xff0c;然后点击“下…

年终好价节有什么必买的数码好物?值得入手的数码好物推荐

大家是不是都没听说过好价节&#xff1f;直白点说就是原来的双十二购物狂欢节&#xff0c;只不过换一个说法&#xff0c;不过今年毕竟是第一年换个说法&#xff0c;所以淘宝年终好价节优惠还是值得我们期待的&#xff01;作为年前的最后一波大促&#xff0c;一起来看看有哪些好…

QML通用属性 pyside6

在 QML 中&#xff0c;几乎所有组件都继承自 Item 类型&#xff0c;因此它们共享一些通用的属性。 QML 组件通用属性 位置和尺寸 x 和 y: 组件在其父元素中的位置坐标 Item {x: 100y: 100 }width 和 height: 组件的宽度和高度 Item {width: 200height: 100 }z: 组件在 Z 轴…

SQL server界面操作链接服务器

1.打开链接服务器&#xff0c;右击连接服务器“新建链接服务器” 2.输入链接服务器名称和数据源 3.安全性中输入密码建立远程连接&#xff0c;点击确定&#xff1a; 4.打开新建的连接服务器&#xff0c;测试连接&#xff1a; 注意:链接服务器必须在局域网执行&#xff0c;不是同…

【Openstack Train安装】十、Neutron安装

Neutron&#xff0c;是Openstack中的一大核心组件&#xff0c;设计目标是实现“网络即服务&#xff08;Networking as a Service&#xff09;”。为了达到这一目标&#xff0c;在设计上遵循了基于 SDN 实现网络虚拟化的原则&#xff0c;在实现上充分利用了 Linux 系统上的各种网…

Python简单线性回归算法实现及应用示例

简单线性回归&#xff0c;是一种使用单个特征预测响应的方法。 它是机器学习爱好者了解的最基本的机器学习模型之一。 在线性回归中&#xff0c;我们假设两个变量&#xff0c;即因变量和自变量是线性相关的。 因此&#xff0c;我们尝试找到一个线性函数&#xff0c;作为特征或自…

4.5-容器之间的link

我们在实际项目中可能会有种需求&#xff0c;假如我们有个后台项目&#xff0c;它要访问数据库&#xff0c;比如MySQL&#xff0c;它想要访问数据库&#xff0c;就需要数据库的ip和端口。如果有两个容器&#xff0c;一个容器启动的是数据库的MySQL服务&#xff0c;另一个容器启…

时间序列分析【python代码实现】

时间序列分析是一种用于建模和分析时间上连续观测的统计方法。 它涉及研究数据在时间维度上的模式、趋势和周期性。常见的时间序列分析包括时间序列的平稳性检验、自相关性和部分自相关性分析、时间序列模型的建立和预测等。 下面是一个使用Python实现时间序列分析的示例&…

通过分析波形,透彻理解 UART 通信

UART是一种异步全双工串行通信协议&#xff0c;由 Tx 和 Rx 两根数据线组成&#xff0c;因为没有参考时钟信号&#xff0c;所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数&#xff0c;从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…

Vue修改密码功能的源代码

基本需求 输入框不能为空 旧密码表单提交时必须正确 两次输入新密码一致 限定新密码的复杂度&#xff0c;这里是长度在 6 到 20 个字符 <template><el-form ref"form" :model"user" :rules"rules" label-width"80px"><…

给企业做公众号运营你都有哪些宝贵经验?

运营企业公众号需要长期的坚持和不断的创新&#xff0c;如何运营好一个企业公众号&#xff0c;使其成为企业与受众互动、传递价值、提升品牌形象的平台&#xff0c;是许多企业所面临的挑战。但只要不断学习&#xff0c;总结经验&#xff0c;就一定能够找到适合自己企业的公众号…

数据集笔记 :PEMS-BAY

数据地址&#xff1a;DCRNN - Google 云端硬盘 各station 位置&#xff1a;DCRNN/data/sensor_graph/graph_sensor_locations_bay.csv at master liyaguang/DCRNN (github.com) 1 读取 数据 import h5py fileDownloads/pems-bay.h5fh5py.File(file,r) f.keys()f[speed] #&…

几个python 编程题。

请定义一个Cylinder类&#xff0c; (1)每个Cylinder类对象可以存储一个圆柱体(包括半径和高) (2)具有用于初始化半径和高的方法 (3)具有输出圆柱体信息的方法Printlnfo ; (4)具有计算圆柱体体积的方法GetVolume. class Cylinder:def __init__(self, radius0.0, height0.0):self…

PHP调用API接口的方法及实现(一键采集淘宝商品详情数据)

随着互联网、云计算和大数据时代的到来&#xff0c;越来越多的应用程序需要调用第三方的API接口来获取数据&#xff0c;实现数据互通和协同工作。PHP作为一种常用的服务器端语言&#xff0c;也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用API接口的方…

JMeter+Jenkins接口压力测试持续集成

项目介绍 接口功能测试应用&#xff1a; http://www.weather.com.cn/data/cityinfo/<city_code>.html 测试功能&#xff1a;获取对应城市的天气预报 请求方法&#xff1a;Get 压测脚本开发工具&#xff1a;jmeter 源码脚本位置&#xff1a; https://github.com/shife…