C语言-atoi()库函数的模拟实现

文章目录

  • 前言
  • 一、atoi()库函数的介绍及使用
    • 1.1 atoi()库函数介绍
    • 1.2 atoi()库函数使用
  • 二、atoi()库函数的模拟实现
    • 2.1 函数设计
    • 2.2 函数实现思路
    • 2.3 具体实现
    • 2.4 测试
  • 总结


前言

本篇文章介绍c语言中库函数atoi()的使用,以及模拟实现库函数。


一、atoi()库函数的介绍及使用

1.1 atoi()库函数介绍

以下是cplusplus网站关于atoi()库函数的介绍。atoi()库函数
在这里插入图片描述
说明:

  • 首先,这个函数会将字符串前面的空格一一跳过,直到遇到非空格字符;这个非空字符分为以下情况

    • 如果非空字符为字母,则返回结果为0
      比如"abc123",转换得到0
    • 如果非空字符为’-',则会转换得到一个负整数且这个负整数没有超过int表示的范围,正常返回这个数;如果这个数超过了int型数据的表示范围,则返回-2147483648
      例如,
      “-12345”,转换得到整型数值-12345
      "-123456789123456"转换得到-2147483648
    • 如果非空字符为‘+’或者为数字字符,则会转换得到一个正整数且这个正整数没有超过int表示的范围,正常返回这个数;如果这个数超过了int型数据的表示范围,则返回2147483647
      例如,
      "+12345"转换得到整型数值12345
      "123456"转换得到整型数值12345
      "123456789123456"转换得到2147483647
  • 如果str指向的是一个空字符串或者只包含空格,则返回值为0.

  • 如果两个数字字符之间存在其他非数字字符,则转换非数字字符之前的数字字符。
    “123ab112”,只会转换得到整型数值123

1.2 atoi()库函数使用

  • 负数转换
    在这里插入图片描述

  • 负数溢出转换
    在这里插入图片描述

  • 正数转换
    在这里插入图片描述

  • 正数溢出转换
    在这里插入图片描述

  • 包含非数字字符
    (1)数字字符后面包含其他字符
    在这里插入图片描述

(2)数字前面包含非数字字符
在这里插入图片描述

  • 只包含非数字字符
    在这里插入图片描述

二、atoi()库函数的模拟实现

2.1 函数设计

函数名:StrToInt
函数返回值类型: int
函数参数类型: const char* str
int StrToInt(const char* str);

2.2 函数实现思路

  1. 函数指针的非空判断
//指针的非空判断 利用断言
assert(str);
  1. 空字符串的判断
//如果第一个字符为'\0',则表示字符串为空串
if('\0' == *str)
{return 0;
}
  1. 跳过字符串前面的空格字符
//利用库函数提供isspace()函数判断
while(isspace(*str)) str++;
  1. 正数和负数的符合判断
int flag = 1; //默认为正数
switch(*str)
{
case '-': flag = -1;
case '+': str++;
}
  1. 字符数字与整型数值的转换
//1.如果溢出判断使用long long
long long ret = 0;
while(isdigit(*str))  //isdigit()函数为库函数
{ret = 10*ret + flag*(*str - '0');//溢出判断if(ret > INT_MAX){return INT_MAX;}else if(ret < INT_MIN){return INT_MIN;}str++;
}
return  (int)ret;//2. 如果溢出判断不使用long long
int ret = 0;
while(isdigit(*str))
{int ConvertDigit = *str - '0';if((ret > INT_MAX/10) || ((INT_MAX/10 == ret) && (ConvertDigit > 7))){return flag > 0? INT_MAX:INT_MIN;}ret = ret*10 + ConvertDigit; 
}
return flag > 0 ? ret : -ret;

2.3 具体实现

  • 方法一(使用long long)
#include<assert.h>
#include<limits.h>
#include<ctype.h>
//version 1.3 
int StrToInt(const char* str)
{//1. 空指针判断assert(str);//2. 空字符串判断if ('\0' == *str){return 0;}//3. 去掉空格while (isspace(*str)) str++;long long ret = 0; //long long 用于判断转换结果是否超出int的表示范围int flag = 1; //用于判断是否为负数,默认为非负数//4. + - 判断switch (*str){case '-': flag = -1;case '+': str++;}//转换操作while (isdigit(*str)){ret = ret * 10 + flag * (*str - '0');//5. 溢出判断if (ret > INT_MAX){return INT_MAX;}if (ret < INT_MIN){return INT_MIN;}++str;}return (int)ret;
}
  • 方法二(不使用long long)
#include<assert.h>
#include<limits.h>
#include<ctype.h>// version: 1.4 
// 溢出判断不使用long long
// 1. ConvertDigit = *str - '0'   ->得到字符转换成的数字
// 2. ret = ret*10 + ConvertDigit ->得到计算的结果,默认为正数,最后根据符号返回结果  
// 3. (正数溢出判断) 上一次 ret > INT_MAX/10   
//				 说明下一次计算的ret >= INT_MAX		   则正数溢出
// (负数溢出判断) 上一次 ret == INT_MAX/10 && ConvertDigit > 7  
//				 说明下一次相加 ret >= INT_MIN的绝对值   则负数溢出
//  INT_MAX = 2147483647   INT_MIN = -2147483647-1
// 最后根据flag返回结果  flag > 0 返回INT_MAX  否则返回INT_MIN    
// 4. flag > 0  直接返回 ret   flag < 0 返回-ret
int StrToInt(const char* str)
{//1. 空指针判断assert(str);//2. 空串判断if ('\0' == *str){return 0;}//3. 清除空格while (isspace(*str)) str++;//4. 正负号判断int flag = 1;  //默认为正数switch (*str){case '-': flag = -1;case '+': str++;}//5. 转换int ret = 0;while (isdigit(*str)){int ConvertDigit = *str - '0';//溢出判断if ((ret > (INT_MAX / 10)) || (((INT_MAX/10) == ret) && (ConvertDigit > 7))){return (flag > 0) ? INT_MAX : INT_MIN;}ret = ret * 10 + ConvertDigit;str++;}return flag > 0 ? ret : -ret;
}

2.4 测试

  • 负数
    在这里插入图片描述

  • 负数溢出
    在这里插入图片描述

  • 正数
    在这里插入图片描述

  • 正数溢出
    在这里插入图片描述

  • 包含非数字字符
    (1)数字字符后面包含非数字字符
    在这里插入图片描述
    (2)数字字符前面包含非数字字符
    在这里插入图片描述


总结

本篇文章介绍了库函数atoi()的使用,并使用不同的思路模拟实现atoi()。

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

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

相关文章

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

【数据结构】第七节:堆

个人主页&#xff1a; 深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) ​ 目录 一、堆 1.堆的概念 2.堆的定义 二、堆的实现 1.初始化和销毁 2.插入 向上调整算法 3.删除 向下调整算法…

DDoS攻击的最新动态及市场趋势分析

随着数字化转型的加速和网络连接设备的增加&#xff0c;分布式拒绝服务(Distributed Denial of Service, DDoS)攻击已经成为全球网络安全领域的一大威胁。根据最新的市场研究报告&#xff0c;预计到2028年&#xff0c;DDoS防护软件市场的复合年增长率将达到14%以上&#xff0c;…

Threes 特效 炫酷传送门HTML5动画特效

基于Three.js的HTML5 3D动画&#xff0c;这个动画模拟了游戏中的一个炫酷的3D场景&#xff0c;支持360度视角查看&#xff0c;也支持鼠标滚轮进行缩放。画面中主要展现了一个游戏中传送门的效果&#xff0c;同时还有路两边的围栏、灯笼、石头&#xff0c;以及星光闪闪的萤火虫&…

springboot vue 开源 会员收银系统 (2) 搭建基础框架

前言 完整版演示 前面我们对会员系统https://blog.csdn.net/qq_35238367/article/details/126174288进行了分析 确定了技术选型 和基本的模块 下面我们将从 springboot脚手架开发一套收银系统 使用脚手架的好处 不用编写基础的rabc权限系统将工作量回归业务本身生成代码 便于…

宿舍管理系统--毕业设计

毕业设计&#x1f4bc;MD5加密&#x1f512;SSM框架&#x1f3a8;Layui框架&#x1f384; 实现功能 管理员的登录与登出 管理员,班级,学生,宿舍&#xff0c;卫生&#xff0c;访客各模块增删改查 个别模块关联查询 各个模块数据导出Excel 一些截图

双向链表C++,C#,Java版,这些程序大多已经过测试,一直在用。

先C版吧&#xff0c;我最先用的是C#,后来是Java&#xff0c;后来改用C版的&#xff0c;因为现在一直在用C&#xff0c;单链 表一直没写上去&#xff0c;因为我很少用&#xff0c;用的是双链表。 执行代码例子1&#xff1a; int main() { _DList<_string> s…

重学java 40.多线程 — 死锁和线程状态

—— 24.5. 一、死锁 1.死锁介绍&#xff08;锁嵌套就有可能产生死锁&#xff09; 指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁 例&#xff1a; 两线程处于互相等待的状态&a…

nss刷题(3)

1、[SWPUCTF 2021 新生赛]include 根据提示传入一个file后显示了关于flag的代码 这是一个文件包含&#xff0c;考虑php伪协议&#xff0c;构造payload&#xff1a; ?filephp://filter/readconvert.base64-encode/resourceflag.php 2、[SWPUCTF 2021 新生赛]Do_you_know_http …

MyBatisPlus使用流程

引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependency> 版本号根据需要选取 在实体类上加注解声明&#xff0c;表信息 根据数…

go-zero 实战(5)

引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置&#xff0c;我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…

网络拓扑—DHCP服务配置

文章目录 DHCP服务搭建相关配置细节前提安装DHCP服务 DHCP服务搭建 相关配置细节前提 系统&#xff1a;Windows Server 2003 IP网段&#xff1a;10.0.0.0/24 三台机子&#xff1a; 普通PC机 DHCP服务器 路由器&#xff08;两块网卡&#xff0c;连接内外网&#xff09; //注…

中国主要城市房价指数数据集(2011-2024)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2011年1月 - 2024年4月 数据范围&#xff1a;中国主要城市 包含指标&#xff1a; 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

get和post的区别,二者是幂等的吗?

一、什么是幂等 所谓幂等性通俗的将就是一次请求和多次请求同一个资源产生相同的副作用。 维基百科定义&#xff1a;幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执…

Docker(四) 文件和网络

1 Dockerfile 1.1 什么是Dockerfile Dockerfile是一个文本文件&#xff0c;包含一系列命令&#xff0c;这些命令用于在 Docker 镜像中自动执行操作。Dockerfile 定义了如何构建 Docker 镜像的步骤和所需的操作。 Dockerfile 中包含的命令可以设置和定制容器的环境&#xff0c;…

优于InstantID!中山大学提出ConsistentID:可以仅使用单个图像根据文本提示生成不同的个性化ID图像

给定一些输入ID的图像&#xff0c;ConsistentID可以仅使用单个图像根据文本提示生成不同的个性化ID图像。效果看起来也是非常不错。 相关链接 Code:https://github.com/JackAILab/ConsistentID Paper&#xff1a;https://ssugarwh.github.io/consistentid.github.io/arXiv.pd…

一文带你入门ini格式

引入: 以蜂鸣器为例&#xff0c;每次我们增加新的设备&#xff0c; 都需要添加两个新文件: 修改程序代码&#xff0c;手动添加: 缺点: 不利于维护 设备类节点直接通过ini文件配置 什么是.ini文件 ini文件通常以纯文本形式存在&#xff0c;并且包含了一个或多个节&#xff08;se…

java技术:spring-secrity实现认证、授权

目录 一、依赖 二、逻辑图 三、代码设计 1、WebSecurityConfigurerAdapter的实现类 2、设计登录接口 config配置&#xff1a; 1&#xff09;UserDetailsService实现类重写&#xff1a; 2&#xff09;书写登录实现类&#xff08;调用authenticationManager、可以与后面的…

重新夺回控制权!原创始人从Synk回购FossID,致力于解决开源许可合规风险

FossID 于 2022 年 9 月被其原始创始人从 Snyk, Inc. 重新收购。为什么 Snyk 在 2021 年收购了 FossID&#xff0c;又在 2022 年将其分拆&#xff0c;以及为什么 FossID 的创始人&#xff08;Oskar Swirtun 和 Jon Aldama&#xff09;后来又回购了该公司&#xff1f; 公司背景 …

类和对象的基本概念

类和对象的基本概念 C和C中struct区别类的封装封装访问权限总结struct和class的区别 将成员变量设置为private C和C中struct区别 C语言struct只有变量C语言struct 既有变量&#xff0c;也有函数 类的封装 封装 把变量&#xff08;属性&#xff09;和函数&#xff08;操作&a…