atoi函数的模拟实现

函数原型:int atoi (const char * str);

作用:将字符串转换为整数

注意事项:

1、会忽略字符串前的空白字符,并从第一个非空白字符开始解析整数,直到遇到非数字字符为止

具体代码如下: 

#include <stdio.h>
#include <limits.h>

int my_Atoi(const char* str) {
    int sign = 1; // 记录符号,默认为正数
    int result = 0;
    int i = 0;

    // 跳过前导空格
    while (str[i] == ' ') {
        i++;
    }

    // 处理符号位
    if (str[i] == '-' || str[i] == '+') {
        sign = (str[i++] == '-') ? -1 : 1;
    }

   // 解析数字并计算结果,如果解析到的不是数字就直接返回结果
   while (str[i] >= '0' && str[i] <= '9')
   {
       if ((result > INT_MAX / 10) || 
          ((result == INT_MAX / 10) && (str[i]-'0' > INT_MAX % 10)))
           { 
           return (sign == -1) ? INT_MIN : INT_MAX; 
           }
     
       result = result * 10 + (str[i++] - '0');
   }

   return result * sign;
}

int main() {
   const char* str = "12345";
   printf("%d\n", my_Atoi(str));
   return 0;
}

具体模拟思路如下:

1、定义变量 `sign` 记录字符串前的正负号,默认为正数

2、循环跳过字符串前面的空白字符

3、判断符号,如果遇到 '-' 符号,则将 `sign` 设置为 -1;如果遇到 '+' 符号或没有符号,则将 `sign` 设置为 1

4、循环解析数字并计算结果。同时在每次迭代中,检查是否会发生溢出情况(即结果超出整数范围),如果溢出,则根据符号返回 INT_MIN 或 INT_MAX

if ((result > INT_MAX / 10) || ((result == INT_MAX / 10) && (str[i]-'0' > INT_MAX % 10)))解释:

        在判断溢出时,我们可以直接将当前结果 result 与 INT_MAX 进行比较。但是为了更准确地检测溢出的情况,我们需要额外进行一些计算:

首先,我们将整数类型的最大值 INT_MAX 除以 10,并得到一个上限值(max_limit)。这个上限值告诉我们,在追加下一位数字之前,当前结果最多只能达到 max_limit

然后,在判断溢出时,有两种情况需要考虑:

  1. 如果当前结果已经超过了 max_limit(即 (result > max_limit)),那么再追加下一位数字就会导致溢出。因此,直接返回适当符号乘以整数类型的极限值(正负都可以)。

  2. 如果当前结果等于 max_limit 并且下一位字符对应的数字大于剩余可容纳值(即 (str[i]-'0' > INT_MAX % 10)),那么再追加一个数字也会导致溢出。同样地,在这种情况下返回适当符号乘以整数类型的极限值。

通过这样的判断条件组合, 我们可以更准确地检测是否发生了溢出,并及时处理它们。这样能够保证转换后得到的结果在合理范围内,并避免由于数据过大而导致的错误。

~over~
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sscanf提取相应字符到数组

代码如下 #include<stdio.h> #include<string.h>int main(int argc, char const *argv[]) {char buf[128] {0};int m1 0, m2 0;int s1 0, s2 0;char lrc[128] "";sscanf("[02:16.33][04:11.44]我想大声宣布对你恋恋不舍","[%*1d%d…

gitLab server version 13.12.1 is not supported

拉代码的时候&#xff0c;报的这个错&#xff0c;实际上就是因为gitLab 版本太低了&#xff0c;这里不准备升级版本&#xff0c;打算继续使用账号密码来拉取代码 在idea已经安装的插件中&#xff0c;去掉gitlab插件&#xff0c;如下&#xff1a; 之后再拉取代码&#xff0c;就…

五分钟学会搭建悟空CRM内网穿透,实现公网访问企业内网,提升工作效率!

文章目录 前言1. 无需公网IP&#xff0c;使用cpolar实现悟空CRM远程访问2. 通过公网来访问公司内网悟空CRM3. 设置固定连接公网地址 前言 悟空CRM是一款开源的客户关系管理系统&#xff0c;以"客户关系一对一理论"为基础&#xff0c;通过对企业业务流程的重组来整合…

【MATLAB】史上最全的7种回归预测算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有9种时序预测算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一算法的代码&#xff08…

《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了

C11后有了标准的线程库&#xff1a; #include <thread>并发 是指多个线程任务在同一个CPU上快速地轮换执行&#xff0c;由于切换的速度非常快&#xff0c;给人的感觉就是这些线程任务是在同时进行的&#xff0c;但其实并发只是一种逻辑上的同时进行&#xff1b; 并行 是…

GPTS全网刷屏!定制增长速度指数增长

还记的上周OpenAI刚刚举行完开发者大会&#xff0c;在大会上主要公布了三个事情&#xff1a; 新版本的GPT-4 Turbo&#xff1a;更强大、更便宜且支持128K新的助手API&#xff1a;让开发者更轻松地基于GPT构建辅助AI应用平台中新的多模态功能&#xff1a;包括视觉、图像创作&am…

MIB 6.1810操作系统实验:准备工作(Tools Used in 6.1810)

6.1810 / Fall 2023 实验环境&#xff1a; Ubuntuxv6实验必要的依赖环境能通过make qemu进入系统 $ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-ri…

Day1跟李沐学AI-深度学习课程00-04【预告、课程安排、深度学习介绍、安装、数据操作+数据预处理】

00 预告 《动手学深度学习》https://github.com/d2l-ai/d2l-zh 01 课程安排 02 深度学习介绍 03 安装 本地安装 使用conda/miniconda环境 conda env remove d2l-zh conda create -n -y d2l-zh python3.8 pip conda activate d2l-zh 安装需要的包 pip install -y jupyter …

云ES容灾方案

一、ES集群可用性容灾 1.1 云ES集群可用性容灾(使用跨可用区实例) 云ES集群部署在三个可用区,单可用区故障,云ES集群依然可能对外提供服务;两个可用区故障,需要进行控制台切流(集群会自动切的选择主节点) 应用服务部署在二个可用区,单可用区故障,依然可对提供服务1.2 …

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…

数据结构-二叉树力扣题

目录 1.相同的树 2.二叉树中查找值为x的节点 3.单值二叉树 4.对称二叉树 5.二叉树的前序遍历 6.另一颗树的子树 层序遍历&#xff1a; 7.二叉树遍历 8.判断二叉树是否是完全二叉树 一个特殊的性质&#xff1a; 1.相同的树 题目链接&#xff1a;力扣&#xff08;LeetC…

与7无关的数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

LeetCode热题100——二分查找

二分查找 1. 搜索插入位置2. 搜素二维矩阵3. 在排序数组中查找第一个和最后一个元素位置 1. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 // 题…

MySQL5.7安装详细过程--window系统

1、Window安装MySQL5.7详细过程 1.1、下载MySQL5.7安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 1.2、将文件解压到盘符中 你可以解压到你想解压的位置&#xff0c;放在C或其他盘符都可以。 我放在了C盘中&#xff1a;C:\Program Files\my…

【AI视野·今日Robot 机器人论文速览 第六十四期】Fri, 27 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 27 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers 6-DoF Stability Field via Diffusion Models Authors Takuma Yoneda, Tianchong Jiang, Gregory Shakhnarovich, Matthew R. …

TikTok运营干货——养号篇

随着国内抖音红利的进一步释放&#xff0c;越来越多人涌入了TikTok国内外市场。而TikTok作为海外新兴的社媒平台&#xff0c;也在迅速的发展着&#xff0c;吸引了大批的跨境电商玩家入驻。然而&#xff0c;TikTok运营的一大难点就是养号&#xff0c;许多人还没开始转化号就被封…

3DMAX各种拼图建模插件集锦之“彩虹系列”

现实生活中我们随处可见各种重复的图案&#xff0c;例如地面上铺设的地砖&#xff0c;砌的砖墙石墙&#xff0c;覆盖着瓦片的屋顶&#xff0c;用作装饰的拼图图案等等&#xff0c;这些重复的拼图单体建模看似简单&#xff0c;但是大面积铺设&#xff0c;如果完全手动就有些费时…

NoC流量控制

参考链接1&#xff1a;https://blog.csdn.net/yang1573/article/details/128787167参考链接2&#xff1a;https://shili2017.github.io/posts/NOC5/参考文件&#xff1a;SE22_noc_flow_control.pdf

桂院校园导航 静态项目 二次开发教程 1.3

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 升级日志 1.3 优化了小程序的数据存储方式&#xff0c;对部分页面进行了调整&#xff0c;调整了功能和代码。 引入weui组件库&#xff0c;使地点的呈现方式更加美观 序号内容详情…

为什么esp8266刷入了固件,无法接受AT指令

我遇到的解决方法是&#xff1a;是串口调试助手出了问题。所以需要更换一个串口调试助手软件。 上面这个就是我换了的软件 在开发的时候&#xff0c;经常会遇到软件故障&#xff0c;导致正确的方法&#xff0c;但是没有效果&#xff0c;好比以前用盗版的8.7版本的Proteus模拟…