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

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()。

相关文章:

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

文章目录 前言一、atoi()库函数的介绍及使用1.1 atoi()库函数介绍1.2 atoi()库函数使用 二、atoi()库函数的模拟实现2.1 函数设计2.2 函数实现思路2.3 具体实现2.4 测试 总结 前言 本篇文章介绍c语言中库函数atoi()的使用&#xff0c;以及模拟实现库函数。 一、atoi()库函数的…...

定时监测服务器磁盘是否超过阈值,超过就删除docker 镜像

达到指定百分比 删除镜像脚本 df -h 查找到 内存占用信息 &#xff0c;得到的 文件系统名称是 overlay的&#xff0c;Use% 达到70就进行删除docker 镜像 #!/bin/bash# 设置磁盘使用阈值 THRESHOLD70# 获取 overlay 文件系统的磁盘使用百分比 DISK_USAGES$(df -h | grep overl…...

UDP聊天室

服务器端 #include <myhead.h>#define SER_IP "192.168.124.38" #define SER_PORT 8888 #define RBUFSIZE 128 #define WBUFSIZE 128typedef struct node{char usrName[20];struct sockaddr_in cli_sockaddr;struct node* next; }node, *node_p;node_p create…...

LLM多模态——GPT-4o改变人机交互的多模式 AI 模型应用

1. 概述 OpenAI 发布了迄今为止最新、最先进的语言模型 – GPT-4o也称为“全“ 模型。这一革命性的人工智能系统代表了一次巨大的飞跃&#xff0c;其能力模糊了人类和人工智能之间的界限。 GPT-4o 的核心在于其原生的多模式特性&#xff0c;使其能够无缝处理和生成文本、音频…...

安卓手机APP开发__蓝牙功能概述

安卓手机&#xff21;&#xff30;&#xff30;开发&#xff3f;&#xff3f;蓝牙功能概述 目录 概述 基本内容 关键的类和接口 概述 安卓平台支持了蓝牙网络栈&#xff0c;它允许一个设备和其它的蓝牙设备进行无线的交换数据。 &#xff21;&#xff30;&#xff30;的框架…...

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

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

农场--Kruskal应用--c++

【题目要求】 农场里有一些奶牛&#xff0c;作为食物的草料不够了。农场主需要去别的农场借草料。该地区有N (2 < N < 2,000) 个农场&#xff0c;农场名称用数字N标识&#xff0c;农场之间的道路是双向的&#xff0c;一共有M (1 < M < 10,000)条道路&#xff0c;单…...

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了...

IRFB3207PBF TO-220 N沟道75V/180A 直插MOSFET场效应管

英飞凌&#xff08;Infineon&#xff09;的 IRFB3207PBF 是一款高性能的 N 沟道 MOSFET&#xff0c;适用于多种电子设备和系统中的高侧开关应用。以下是 IRFB3207PBF 的一些典型应用场景&#xff1a; 1. 电源管理&#xff1a;在电源管理系统中&#xff0c;IRFB3207PBF 可以作为…...

基于单张图片快速生成Metahuman数字人(模型贴图绑定)的工作流演示

基于单张图片快速生成Metahuman数字人&#xff08;模型贴图绑定&#xff09;的工作流演示 MetahumanModeler, 是我基于facebuilder以及metahuman的理解开发而成&#xff0c;插件可以基于单张图片生成metahuman拓扑结构的面部3d模型&#xff0c;同时生成对应的面部的贴图&#…...

MySQL数据库下的Explain命令深度解析

Explain是一个非常有的命令&#xff0c;可以用来获取关于查询执行计划的信息&#xff0c;以及如何解释输出。Explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有一定的局限性&#xff0c;并不总是会说出真相&#xff0c;但是它的输出是可以获取的最好信息&…...

防火墙技术基础篇:基于IP地址的转发策略

防火墙技术基础篇&#xff1a;基于IP地址的转发策略的应用场景及实现 什么是基于IP地址的转发策略&#xff1f; 基于IP地址的转发策略是一种网络管理方法&#xff0c;它允许根据目标IP地址来选择数据包的转发路径。这种策略比传统的基于目的地地址的路由更灵活&#xff0c;因…...

OpenFeign快速入门 替代RestTemplate

1.引入依赖 <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.spr…...

自动化测试--利用pytest实现整条业务链路测试

​ 概述 前面一章讲解了单个接口的测试&#xff0c;但是实际项目中&#xff0c;因为权限和登录状态的限制&#xff0c;大部分接口没办法直接访问到&#xff0c;这时候我们想访问到一个系统的接口&#xff0c;就需要模拟用户登录拿到用户的token和所拥有的权限之后再将这些信息…...

学习其他推理判断

学习其他推理判断 1.类比推理1.1语义关系1.2逻辑关系1.3 语法关系2.定义判断3.翻译推理3.1前推后:A→B3.2后推前:B→A3.3推理规则4.组合排列5.日常结论6.逻辑论证6.1削弱题型6.2加强题型7.原因解释1.类比推理 类比推理:给出一组相关的词,通过观察分析,在备选答案中找出一组…...

Centos7环境下MySQL5.7.38 安装开源审计插件 mysql-audit

MySQL安装开源审计插件 mysql-audit MySQL 5.7.38安装审计插件 mysql-audit安装MySQL1.查看Linux服务器版本和glibc版本2.根据自己的系统下载对应的MySQL版本&#xff0c;由于mysql-audit并不支持所有版本的MySQL&#xff0c;所以在确定MySQL版本之前请注意下插件支持的MySQL版…...

基于深度学习的表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人工智能技术的快速发展&#xff0c;表情识别成为了人机交互领域的一个研究热点。表情识别技术旨…...

Debug-010-git stash的用法及使用场景

问题原因&#xff1a; 其实也不是最近&#xff0c;就是之前就碰到过这个问题&#xff0c;那就是我正在新分支开发新功能&#xff0c;开发程度还没有到可以commit的程度&#xff0c;我不想提交(因为有些功能没有完全实现&#xff0c;而且没有自测的话很容易有问题&#xff0c;提…...

RustGUI学习(iced/iced_aw)之扩展小部件(二十五):如何使用tab部件来创建tab多页面切换?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第二十五篇,主要讲述tab页面切换部件的使用,会结…...

P2P服务端模型配合 Tool.net P2pServerAsync 类使用

Tool.Net 支持的 P2P 服务器模型实例 说明服务器部分相关代码相关调用实例Tcp版本Udp版本 最后附一张思维图 说明 当前文章&#xff0c;仅是Tool.Net 开源库的一个缩影。本次更新V5.0版本以上提供支持。可以提供简单实现P2P功能用于业务开发。 服务器部分相关代码 完整代码&…...

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…...

docker所在磁盘空间不足 迁移数据

1.查看原始目录docker info | grep "Docker Root Dir" 一般在/var/lib/docker 2.停止docker service docekr stop 3.移动数据 注意 移动前不要创建docker目录&#xff01; mv /var/lib/docker /home/docker 4.进入目录查看是否与原始目录相同&#xff0c;确认一…...

15、24年--信息系统管理——管理要点

1、数据管理 数据管理使指通过规划、控制与提供数据和信息资产的职能,包括开发、执行和监督有关数据的计划、策略、方案、项目、流程、方法和程序,以获取、控制、保护、交付和提高数据和信息资产价值。 DCMM定义了数据战略、数据治理、数据架构、数据应用、数据安全、…...

如何使用 CapSolver 扩展找到 Google reCAPTCHA 站点密钥?

网站安全性在当今至关重要&#xff0c;Google reCAPTCHA 作为防止垃圾邮件和滥用行为的前线防御系统起着关键作用。reCAPTCHA 站点密钥是确保网站交互由人类驱动的唯一标识符。了解如何找到这个密钥对于网站管理员和开发人员来说至关重要。 什么是 reCAPTCHA 站点密钥 reCAPT…...

安卓分身大师4.6.0解锁会员安卓14可用机型伪装双开多开

需登录解锁会员功能&#xff0c;除了加速进入不能&#xff0c; 其他主要功能都是可以使用&#xff0c;由于验证较多一些功能需要特定操作使用&#xff0c;进行伪装时请不要直接伪装&#xff0c;先生成成功后再进行自定义伪装&#xff01;链接&#xff1a;https://pan.baidu.com…...

攻防世界-mobile-easy-app详解

序言 这道题网上很多分析&#xff0c;但是分析的都是arm版本的&#xff0c;我选了arm64的来分析&#xff0c;arm64相比arm难度高一些&#xff0c;因为arm64编译器搞了inline优化&#xff0c;看起来略抽象 分析 这道题逻辑很简单&#xff0c;输入flag然后一个check函数验证&a…...

【简单介绍下爬山算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

Android App启动流程和源码详解

前言 之前看了些App启动流程的文章&#xff0c;但是看得很浅显&#xff0c;隔了没多久就忘了&#xff0c;自己抓耳挠腮的终于看完了&#xff0c;看得头疼哦。因为很多是个人理解&#xff0c;大哥们主打一个7分信&#xff0c;2分思考&#xff0c;1分怀疑哈。 主要看的源码是An…...

SQL的多表联查

这里我先附上两张表的数据&#xff1a; Orders 表: OrderIDCustomerID1321324NULL Customers 表: CustomerIDCustomerName1Alice2Bob3Charlie4David INNER JOIN &#x1f91d; 概念&#xff1a; INNER JOIN&#xff08;内连接&#xff09;返回两个表中匹配的记录。如果某条…...

瑞芯微RV1126——人脸识别源码分析

本节内容主要分为3部分&#xff0c;第一部分是流程结构图;第二部分为人脸识别代码流程;第三部分为具体的代码分析。 1.流程结构图 2.人脸识别代码流程 1、人脸数据的初始化&#xff1a; init_all_rockx_face_data();init_face_data();2、创建rtsp会话&#xff0c;这里包括发…...