atoi函数的模拟实现

news2024/11/26 18:26:41

函数原型: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~
 

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

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

相关文章

异行星平台--CRM系统搭建

使用异行行低代码平台搭建的CRM系统。CRM系统中&#xff0c;包括“客户”、“商机”、“合同”、“回款”、“开票”、“营销”、“回访”、“产品”、“联络人”、“销售订单”、“线索”。 “管理后台”可能是指一个用于管理后台系统的应用&#xff0c;可能包括对各种功能和数…

Logback 日志格式参数说明

打印日志格式&#xff1a; <property name"LOG_PATTERN" value"[${APP_NAME} ${SERVER_IP}:${SERVER_PORT}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%X{traceId}-%X{spanId}] [%thread] %logger %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/&g…

HMM与LTP词性标注之LTP介绍

文章目录 LTP 上图缺点&#xff1a;参数太多&#xff0c;中文语料库匮乏 注意力机制&#xff0c;相当于给每一个词赋予一个权重&#xff0c;权重越大的越重要。 bert的缺点&#xff1a;神经元太多&#xff0c;较慢。 LTP 如果只是需要做词性的识别&#xff0c;那么用LTP就可…

与7无关的数

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

Transformer原理详解

前言&#xff1a;好久没有用了&#xff0c;我已经快忘记了自己还有一个CSDN账号了。 在某位不知名好友的提醒下&#xff0c;终于拾起来了&#xff0c;自己也从大二转变成了研二。 目前研究方向主要为&#xff1a;时间序列预测&#xff0c;自然语言处理&#xff0c;智慧医疗 欢迎…

Win通过WSL配置安装Redis

一共分为如下几步&#xff1a; 安装WSL发行版&#xff0c;如Ubuntu安装Redis配置Redis与WSL WSL安装 这里有微软官方的文档&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/install 但我不建议零基础的这么做。很容易输完一些命令之后&#xff0c;把环境弄得乱七…

【python】OpenCV—Image Pyramid(8)

文章目录 1 图像金字塔2 拉普拉斯金字塔 1 图像金字塔 高斯金字塔 在 OpenCV 中使用函数 cv2.pyrDown()&#xff0c;实现图像高斯金字塔操作中的向下采样&#xff0c;使用函数 cv2.pyrUp() 实现图像金字塔操作中的向上采样 import cv2img cv2.imread(C://Users/Administrat…

C#winform门诊医生系统+sqlserver

C#winform门诊医生系统sqlserver说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a;基于C#winform架构和sql server数据库 功能模块&#xff1a; 个人中心&#xff1a;修改个人信息、打开照片并进行修改 预约挂号&#xff1a;二级…

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…

JVM——运行时数据区(堆+方法区+直接内存)

目录 1.Java堆2.方法区**方法区&#xff08;Method Area&#xff09;溢出**方法区&#xff08;Method Area&#xff09;字符串常量池静态变量的存储 3.直接内存(Direct Memory) 1.Java堆 ⚫ 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。 ⚫ 栈…

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

对象存储OSS服务器邀请试用

文章目录 试用产品领取产品试用权限上传文件开启加速传输提交作品小程序提交任务获取奖励 试用产品 先下载要上传的资源 电脑浏览器打开此页面开始试用&#xff0c;页面如下图 未登录的先登录 领取产品试用权限 在该页面中点击立即试用&#xff0c;弹框勾选服务协议并领取试…

差分详解(附加模板和例题)

一、一维差分 1.一维差分运用 设a[N]为原数组,b[N]为差分数组&#xff0c;c[N]为进行操作后得到的新数组 (1).先求出差分数组b[N] for(i1;i<n;i) {cin>>a[i];b[i]a[i]-a[i-1]; } (2).进行差分操作&#xff0c;利用void insert(int l,int r,int c)函数 void ins…

redis运维(五)再探redis

一 redis概述 ① redis简介 redis三大特性&#xff1a; 缓存、分布式内存数据库、持久化说明&#xff1a;非必须不建议在redis终端操作 ② redis亮点 ③ 初露锋芒 redis-benchmark redis-benchmark并发压力测试的问题解析 备注&#xff1a;多次测试取平均值,最好在物理机…

Android修行手册-Gson中不用实体类生成JsonObject或JsonArray

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

那些年我们追过的 内部类

目录 1. 什么是内部类&#xff1f; 2. 内部类的分类 3. 内部类 3.1 实例内部类 3.2 静态内部类 4. 局部内部类 5. 匿名内部类 6.对象的打印 “不积跬步无以至千里&#xff0c;不积小流无以成江海。”每天坚持学习&#xff0c;哪怕是一点点&#xff01;&#xff01;&a…

Java毕业设计心得体会

1. 开始准备选题、开题报告 大四上学期开学时开始准备论文的&#xff0c;首先是确定论文主题&#xff0c;看自己想做什么毕业设计&#xff0c;可以选取之前接触过的&#xff0c;做过的东西&#xff0c;这样快一些&#xff0c;我之前一直是学Java的&#xff0c;就打算直接用Jav…

【网络知识必知必会】再谈Cookie和Session

文章目录 前言1. 回顾 Cookie1.1 到底什么是 CookieCookie 的数据从哪里来Cookie 的数据长什么样Cookie 有什么作用Cookie 到哪里去Cookie 怎么存储的 2. 理解 Session3. Cookie 和 Session 的区别总结 前言 在讲 HTTP 协议时, 我们就谈到了 Cookie 和 Session, 当时我们只是粗…

redis运维(六)redis-cli命令

一 redis-cli 注意&#xff1a; redis-cli核redis-server版本必须适配 --> 见 redis-cli --version提示&#xff1a; 不过一般安装服务端 redis-server 时内置了客户端 redis-cli说明&#xff1a; redis-cli 是 redis 的一种命令行的客户端工具备注&#xff1a; redis-se…

单链表经典OJ题(四)

目录 1、链表中倒数第k个结点 2、消失的数字 3、轮转数组 4、合并两个有序数组 5、数组串联 6、序列中删除指定数字 1、链表中倒数第k个结点 链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com) 这道题依然利用双指针法&#xff0c;具体解题思路如下&#xff1a; 1…