【c语言】atoi的模拟实现

1.头文件

atoi() 是 C语言的一个标准库函数,定义在<stdlib.h>头文件中

2.atoi的解析

具体来讲,atoi() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,识别 “+”、“-” 以及 0-9 之间的十进制数,最后将它们转换成整数。如果构成整数的后面还有其它字符,这些字符将会被忽略。

3.函数申明

在这里插入图片描述
参数
string:指向要转换的字符串。
如果由于 str 为空或者 str 字符串无法转换为整数,函数返回 0。

如果字符串表示的值超出了 int 类型所能表示的整数范围,函数返回的数值是int 最大值或最小值。

4.一些转化的例子

1.如果前面有+,转化后+号去掉在这里插入图片描述


2.如果是-号,则保留
在这里插入图片描述


3.传入的是空指针
在这里插入图片描述

在这里插入图片描述


  1. 有空格的话跳过
    在这里插入图片描述

5.空字符串的转化在这里插入图片描述


6.大于int类型最大值,转化为int类型的最大值
在这里插入图片描述


7.小于int类型最小值,转化为int类型的最小值
在这里插入图片描述


8.出现整数后面有其他字符截断.在这里插入图片描述


9.先出现其他字符比如a
在这里插入图片描述

5.函数实现

1.基本框架

enum State//枚举类型定义转化是否正常
{INVALID,//不正常VALID,//正常}sta= INVALID;//先让其正常
int my_atoi(const char *str)//atoi的具体实现
{}
int main()
{char arr[] = "1234";int ret = my_atoi(arr);//返回转化后的值if (sta == INVALID)//不正常转化{printf("非正常转化-%d",ret);}if (sta == VALID)//正常转化{printf("正常转化-%d", ret);}}

2.处理空指针

int my_atoi(const char *str)//atoi的具体实现
{assert(*str);//处理空指针
}

3.处理空字符串

int my_atoi(const char *str)
{assert(*str);if (*str == '\0')//处理空字符串{                //处理空字符串return 0;    //处理空字符串}}

4.处理空格

int my_atoi(const char *str)
{assert(*str);if (*str == '\0'){return 0;}while (isspace(*str))//处理空格{                    //处理空格str++;            //处理空格}}

5.处理符号位

int my_atoi(const char *str)
{assert(*str);if (*str == '\0'){return 0;}while (isspace(*str)){str++;}int flag = 1;//符号位,如果为1则为正数,如果为-1则为负数,如果没加正号,默认为1;if (*str=='+'){flag = 1;str++;//跳过当前字符}else if (*str == '-'){flag = -1;str++;//跳过当前字符}}

6.处理数字字符

int my_atoi(const char *str)
{assert(*str);if (*str == '\0'){return 0;}while (isspace(*str)){str++;}int flag = 1;if (*str=='+'){flag = 1;str++;}else if (*str == '-'){flag = -1;str++;}
long long r=0;//如果r 为int类型的话,超出范围,可能要截断,这里初始话为0,保证了空字符串返回0while (*str != '\0')//字符还未到末尾{if (isdigit(*str))//判断是否是字符{r = r * 10 + flag**str - '0';//得到字符对应的整数if (r > INT_MAX || r < INT_MIN)//如果超出范围{if (flag == 1){return INT_MAX;//超出int 最大值,就返回最大值}if (flag == -1){return INT_MIN;//超出int 最小值,就返回最小值}}str++;//指针移动下一个字符}else{return r;//如果str指向的不是字符的话,就返回r的值,比如1234a,此时r=1234}}}

6.整体代码

#include<stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include<stdlib.h>
enum State
{VALID,INVALID}sta= INVALID;
int my_atoi(const char* str)
{assert(*str);if (*str == '\0'){return 0;}while (isspace(*str)){str++;}int flag = 1;if (*str == '+'){flag = 1;str++;}else if (*str == '-'){flag = -1;str++;}long long r = 0;while (*str != '\0'){if (isdigit(*str)){r = r*10+(*str-'0')*flag;if (r > INT_MAX || r < INT_MIN){if (flag == 1){return INT_MAX;}else if (flag == -1){return INT_MIN;}}str++;}else{return r;}}sta = VALID;return (int)r;}int main()
{char arr[] = "a111";int ret=my_atoi(arr);if (sta == VALID){printf("正常输出%d",ret);}if (sta == INVALID){printf("非正常输出%d",ret);}}

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

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

相关文章

【脉冲通信】用于空间应用的飞秒脉冲通信的符号误码率模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

TCP通信实战:模拟BS系统

1、之前的客户端都是什么样的 其实就是CS架构&#xff0c;客户端是需要我们自己开发实现的 2、BS结构是什么样的&#xff0c;需要开发客户端吗&#xff1f; 浏览器访问服务端&#xff0c;不需要开发客户端 注意&#xff1a;服务端必须给浏览器响应HTTP协议格式的数据&#xff0…

[swift刷题模板] 树状数组(BIT/FenwickTree)

[TOC]([swift刷题模板] 树状数组(BIT/FenwickTree) ) 一、 算法&数据结构 1. 描述 [python刷题模板] 树状数组 二、 模板代码 1. 单点赋值(增加)&#xff0c;区间求和(PURQ) 例题: 307. 区域和检索 - 数组可修改 class BIT {var c: [Int]var n: Int init(_ n: Int){c…

基于SpringBoot的招生管理系统

基于SpringBoot的招生管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 用户界面 摘要 基于SpringBoot的招生管理系统是一款现…

node快速搭建一个学习资料共享平台

概述 本文要实现的功能比较简单&#xff1a;1、将想要共享的文件分文件夹的组织起来&#xff1b;2、别人可以通过界面进行搜索&#xff1b;3、可以在线预览或下载文件。基于这样的需求&#xff0c;本文分享通过node如何实现这样的功能。 实现效果 实现 1. node端服务 node端…

基于SSM的大学校医管理系统

基于SSM的大学校医管理系统、学校医院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录系统 用户界面 管理员界面 摘要 大学校医管理系统…

​蔚来自动驾驶,从 2020 年开始讲起的故事

2020 年底&#xff0c;摆脱 2019 年阴霾的李斌先生&#xff0c;热情而兴奋&#xff0c;再一次说&#xff1a;「欢迎来到蔚来日。」 那天蔚来发布了令人咋舌的智能驾驶硬件系统&#xff0c;4 块当时甚至还没有宣布量产日期的 Orin 芯片&#xff0c;11 路高清摄像头。 早在 ET7…

汽车智能制造中的RFID技术在供应链生产管理中的应用

行业背景 汽车零部件工业是汽车工业中至关重要的一部分&#xff0c;对于汽车工业的长期稳定发展起着基础性的作用&#xff0c;近年来&#xff0c;汽车配件配套市场规模达到了2000亿元&#xff0c;维修市场达到了600亿元&#xff0c;随着汽车国产化的推进&#xff0c;汽车零部件…

【TensorFlow1.X】系列学习笔记【入门二】

【TensorFlow1.X】系列学习笔记【入门二】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【入门二】前言神经网络的参数神经网络的搭建前向传播反向传播 总结 前言 学习了张量、…

Pandas数据处理分析系列3-数据如何预览

Pandas-数据预览 Pandas 导入数据后,我们通常需要对数据进行预览,以便更好的进行数据分析。常见数据预览的方法如下: ①head() 方法 功能:读取数据的前几行,默认显示前5行 语法结构:df.head(行数) df1=pd.read_excel("销售表.xlsx",sheet_name="手机销…

WMS透明仓库:实现仓储的全方位可视化与优化

一、WMS透明仓库的定义与特点 1. WMS透明仓库的定义&#xff1a;WMS透明仓库是一种基于信息技术的仓库管理系统&#xff0c;通过实时数据采集、分析和可视化&#xff0c;将仓库内外的物流流程、库存状态、人员活动等信息以透明的方式展示给相关利益方。 2. 实时数据采集&…

Hadoop学习总结(搭建Hadoop集群(完全分布式模式))

学习搭建Hadoop集群&#xff08;完全分布式模式&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1wwTKk-XxHbccHjE-Xk2PTA 提取码&#xff1a;q7j7 在SecurityCRT 或者在 Xshell 进行虚拟机链接 &#xff08;这里使用Xshell &#xff09; 在hadoop001里配置 如果没…

中文编程开发语言工具构件说明:屏幕截取构件的编程操作

屏幕截取 用于截取指定区域的图像。 图 标&#xff1a; 构件类型&#xff1a;不可视 重要属性 l 截取类型 枚举型&#xff0c;设置在截取屏幕时的截取类型。包括&#xff1a;全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏&#xff08;PrintScre…

0基础学习PyFlink——模拟Hadoop流程

学习大数据还是绕不开始祖级别的技术hadoop。我们不用了解其太多&#xff0c;只要理解其大体流程&#xff0c;然后用python代码模拟主要流程来熟悉其思想。 还是以单词统计为例&#xff0c;如果使用hadoop流程实现&#xff0c;则如下图。 为什么要搞这么复杂呢&#xff1f; 顾…

xlive.dll下载安装方法分享,教你快速修复xlive.dll文件

在运行某些应用程序或游戏时&#xff0c;你可能会遭遇到"xlive.dll缺失"错误提示&#xff0c;这可能导致程序无法正常运行。本文将向你介绍一些可行的解决方法教你下载xlive.dll文件&#xff0c;并详细阐述xlive.dll是什么文件以及导致其缺失的原因。 一.理解"x…

Docker-镜像的备份迁移及私有仓库的搭建

一、Docker-备份与迁移 A服务器系统配置 B服务器系统配置 1.用命令将容器保存为镜像。 案例&#xff0c;将A服务器的Docker容器迁移到另外一台服务器B&#xff0c;A服务器的容器配置过对应的文件&#xff0c;不想在B服务器重新搭建&#xff0c;可以使用该案例。 docker c…

FL studio21永久激活码 附带一键下载安装包

玩音乐的朋友&#xff0c;对FL studio肯定不陌生&#xff0c;目前最新的版本是FL studio21&#xff0c;这是一款非常强大且专业的音频制作软件&#xff0c;而且还可以编曲、剪辑、录音、混音等等之类的创作操作&#xff0c;使你的计算机成为一个全功能录音室。下面小编就来和大…

抛砖引玉:Redis 与 接口自动化测试框架的结合

接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库&#xff0c;具备快速读写、多种数据结构等特点&#xff0c;为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis&#xff0c;并将其应用于接口自动化测试框架…

Qt实现一个电子相册

一、要实现的功能 在窗口中可以显示图片&#xff0c;并且能够通过两个按钮进行图片的前进和后退的顺序切换。有一个按钮&#xff0c;通过这个按钮可以从所存图片资源中随机选取一个图片进行展示通过按钮可以控制图片自动轮播顺序切换的开始与停止&#xff0c;显示当前系统的时…

使用 LF Edge eKuiper 将物联网流处理数据写入 Databend

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac LF Edge eKuiper LF Edge eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源软件&#xff0c;可以运行在各类资源受限的边缘设备上。eKuiper 的主要目标是在边缘端提供一个流媒体软件…