自己实现一个 atoi 函数

2023-10-27

atoi(ASCII to integer),把字符串转换成整型数。

情况一:输入的字符包含不是数字字符的字符?
例如:“123adc4”.
针对这种情况,我们只要加上判断就行了,只要遇到不是数字字符的直接返回。

情况二:如果在数字字符前面有正负号又该怎么办???
例如:”-123”、“+123”.
针对这种情况,我们再加上判断,判断字符串的第一个字符是不是正负号,并用一个标记位flag记录正负。

情况三:当输入的字符串前面几个字符都是空格又该怎么办???
例:“ -123”,“ +123”.
针对这种情况,库里面的atoi是将空格跳过再进行判断的,所以我们在一开始就用循环将空格跳过,注意这时候要是字符串里面全部是空格,则我们应该返回一个值,就返回0吧。

情况四:当输入的字符串中没有数字时,我们应该返回什么呢???
我们在这种情况下返回0.

情况五:当字符串中的字符数字转化的整数太大,会有可能溢出???
针对这种情况,我们需要做出一个判断,判断转化后的数字当它的范围在long的范围内。

那么最重要的一个问题来了,当你第3、4中情况下,返回的是0,如果输入“0”返回的也是0,这两个0怎么区分呢???,貌似在这里你把3、4两种情况下的返回值设置成什么都不合适。所以我们可以设置一个全局变量state,来记录是不是正常返回。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>



enum State
{
    NORMAL,                        //正常
    ABNORMAL                       //异常
}state;
state = ABNORMAL;                    //将初始状态置为异常
int my_atoi(const  char *src)
{
    assert(src);
    int flag = 1;
    long long ret = 0;
    while (*src==' ')                           //跳过空格
    {
        src++;
    }
    if (*src == '\0')                           //如果这时候字符串已经完了,则直接返回
    {
        return  0;
    }
    if (*src == '+')                            //接下来判断正负
    {
        src++;
    }
    else if (*src == '-')
    {
        flag = -1;
        src++;
    }
    while (*src >= '0'&&*src <= '9')             //读取字符数字转换成整型
    {
        ret = ret * 10 + flag*(*src-'0');
        if (ret >= INT_MAX|| ret <= INT_MIN)          //如果溢出的话直接跳出
        {
            break;
        }
        src++;
    }
    if (*src == '\0')                         //正常返回
        state = NORMAL;                       //将状态置为正常
    return (int)ret;
}
int main()
{
    char arr[50] = { 0 };
    scanf("%s", arr);
    int ret=my_atoi(arr);
    if (state == ABNORMAL)
        printf("异常返回\n");
    printf("%d\n", ret);
    system("pause");
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己实现一个 atoi 函数 的相关文章

  • 一维数组与对象深拷贝的几种方法(指数组、对象中均无嵌套)

    一 万能for循环 直接上代码 var arr 1 2 3 4 5 var obj name aaaaa age 16 var arr2 copyThat arr var obj2 copyThat obj function copyTha
  • MySQL正确配置my.ini的event_scheduler = ON

    MySQL正确配置my ini的event scheduler ON 让事件的定时调度器常开 如下红框圈出部分 永久性设置方法 为何要在my ini中设置 补充mysql做一个event或job有关文章 让事件的定时调度器常开 如下红框圈出
  • 为什么数组的BUFFSIZE要定义为4096比较好?

    先看一个程序 page 69 include apue h define BUFFSIZE 4096 int main int argc char argv int n char buf BUFFSIZE while n read STDI
  • 高级计算机网络

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 RDT协议 rdt1 0 经完全可靠信道的可靠数据传输特点 rdt2 0 经具有比特差错信道的可靠数据传输 校验和 ACK NAK rdt2 1 考虑处理
  • swagger添加@ApiImplicitParams后出现错误 Required String parameter is not present

    swagger添加 ApiImplicitParams后出现错误 并且会报错 HTTP Status 400 Required String parameter xx is not present 原因是 要求post 但是 请求用的是ge
  • make编译kaldi时候遇到的各种错误

    文章目录 第一个问题 aclocal 1 14 command not found 第一个问题 aclocal 1 14 command not found tools openfst 1 6 7 missing line 81 acloc
  • line-height: 1; line-height: 100%;是什么意思

    先简单看个例子 css 页面 应该猜测出来了 line height 1 line height 100 font size 50px 把哪一个放到最后都是一样的 我理解的就是 等于字体高度的 1 整 份 或者 等于 字体高度的 100 高
  • 《这就是区块链》之区块链基础(5)--去中心化的意义

    在上一篇中 花了比较大的篇幅来阐述去中心化的概念 其实对于有计算机基础的朋友来讲 去中心化或者P2P网络并不是新颖的观点 但是 我还是希望本系列文章可以从基础展开 让所有的朋友都可以理解区块链的意义所在 今天我们来谈谈去中心化到底在区块链中
  • matlab的cylinder函数,Matlab基本函数-cylinder函数

    1 cylinder函数 绘制三维圆柱图 2 用法说明 1 x y z cylinder 函数返回一半径和高度都为1的圆柱体x y z轴的坐标值 圆柱体沿其周长有20个等距分布的点 2 x y z cylinder r 函数一个半径为r 高
  • 第十三章:软件项目管理

    第十三章 软件项目管理 一 软件项目管理总述 1 管理 管理是通过计划 组织和控制等一系列活动 合理地配置和使用各种资源 以达到既定目标的过程 2 软件项目管理 软件项目管理先于任何技术活动之前开始 并且贯穿于软件的整个生命周期之中 软件项
  • 关于新版Win10下安装虚拟机提示“Intel VT-x处于禁用状态”如何解决

    给电脑上安装虚拟机 安装的时候可能会遇到问题 提示 Intel VT x处于禁用状态 问题原因 出现这样的原因一般都是由于系统Virtualization Technology虚拟化技术功能 关闭导致的 解决方法 进入新版Win10的BIO
  • QT代码,重载函数d_func()声明形式分析和调用关系分析

    QT代码 重载函数d func 声明形式分析和调用关系分析 define X DECLARE PRIVATE Class inline Class Private d func return reinterpret cast
  • Linux uboot顶层makefile详解 一

    VERSION 2016 主版本号 PATCHLEVEL 03 补丁版本号 SUBLEVEL 次版本号 EXTRAVERSION 附加版本信息 NAME MAKEFLAGS rR include dir CURDIR rR 表示禁止使用内置
  • 快速复习一遍C++基础知识点

    暂定月计划 1实现DSA基础算法 2完成一个STL库 3在Linux上加强相关知识 4git巩固 5OJ增强代码实现能力 今天先快读复习一遍C 知识点 想把peral读完 1 引用 交换两个数示例 C语言中 void swap int a
  • Redis 学习笔记4: Redis 3.2.1 集群搭建

    在CenOS 6 7 linux环境下搭建Redis 集群环境 1 下载最新的Redis版本 本人下载的Redis版本是3 2 1版本 下载之后 解压 编译 make 具体操作可以参考我的博文 Redis 学习笔记1 CentOS 6 7下
  • 使用navicat需要安装mysql吗_[转载] windows安装mysql及使用navicat连接

    参考资料 1 https blog csdn net u013235478 article details 50623693 2 https blog csdn net qq 35436635 article details 8012602
  • 广告公司到底干什么的?欣奥诚分享

    广告公司到底干什么的 这篇文章从产业的角度拆分广告业 还原一个真实的广告业出来 01 它们是谁 早年广告业有4类公司 品牌咨询类公司 设计创意类公司 媒介投放类公司 活动执行类公司 品牌咨询类公司 靠咨询服务为主营业务 为广告主提供品牌战略
  • 七、dokcer-compose部署springboot的jar

    1 准备 打包后包名为 ruoyi admin jar 增加接口 httpL ip port common test han 环境变量预application yml 中REDIS HOSTt的值 去环境变量去找 如果找不到REDIS HO
  • 点云基本概念

    文章目录 一 三维数据的表现形式 二 点云的概念 三 点云的特点 四 点云的获取方式 激光雷达 结构光 立体视觉 TOF相机 一 三维数据的表现形式 三维数据的表现形式一般分为四种 分别是点云 网格 体素与多视图 点云是三维空间中点的集合

随机推荐

  • 【新书推荐】【2020】MATLAB深度学习工具箱用户指南

    Table of contents Deep Networks Deep Learning in MATLAB What Is Deep Learning Try Deep Learning in 10 Lines of MATLAB Co
  • 监控实践: 基于K8S部署Prometheus+Grafana

    使用Prometheus对系统进行监控 使用Grafana进行数据展示 我的环境是K8S 我的部署方式是通过 yaml文件进行部署 已经部署文件上传到了Github 地址 https github com zeyangli devops o
  • SpringMVC系列(三)之CRUD增删改查

    目录 SpringMVC实现增删改查 1 导入相关依赖 2 添加配置文件 3 逆向生成对应的类 4 后台代码编写 5 前台代码编写 SpringMVC实现增删改查 1 导入相关依赖 pom xml
  • WeakMap弱引用

    let obj name 张三 name 张三 这个对象能够被读取到 因为obj这个变量名对它的引用 将引用覆盖掉 obj null 这个对象将会被从内存中移除 因为我们已经失去了对他的所有引用 let obj name 张三 let ar
  • 打开计算机窗口的快捷键是什么,打开多个窗口,用哪个快捷键可以将窗口切换?...

    2006 02 23 上网的时候 一打开窗口就是最小化 怎样可以一打开就是最大化呢 谢谢 IE具有 自动记忆功能 它能保存上一次关闭窗口后的状态参数 IE本身没有提供相关设置选项 不过可以借助修改注册表来实现 打开 注册表编辑器 找到 HK
  • MRTK-Unity简单入门

    前期工作 1 切换生成平台 UWP 2 Microsoft Mixed Reality Feature Tool导入和配置资源 Mixed Reality Toolkit Foundation 混合现实工具包基础 包是唯一的包 必须将它导入
  • 【Android】详解7.0带来的新工具类:DiffUtil

    http blog csdn net zxt0601 article details 52562770 一 概述 DiffUtil是support v7 24 2 0中的新工具类 它用来比较两个数据集 寻找出旧数据集 新数据集的最小变化量
  • 快速排序Java实现

    public class ksSort 快排 param args public static void main String args int test 1 9 5 7 8 2 4 quickSort quick Sort test f
  • 前端:react(柒):react 多个组件共享state

    柒 react 多个组件共享state 经常会遇到几个组件需要共用状态数据的情况 这种情况下 我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理 const scaleNames c Celsius f Fahrenheit fu
  • 为什么PCB设计时经常进行电源平面的内缩

    我们可以发现 有的PCB在GND层和电源层会进行一定程度的电源平面内缩设计 那么大家有没有想过为什么要内缩呢 需要搞清楚这个问题 我们需要来先了解一个知识点 那就是 20H 原则 20H原则主要是为了减小电路板电磁辐射问题提出来的 在电路板
  • C# 操作JSON几种方式盘点

    C 操作JSON几种方式 通过两种在c 中常用的方式来实现对Json数据的序列化和反序列化 为了实现大多数的需求 我们采用稍微复杂一点的数据模型 首先我们有以下json数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • Nginx 中 alias 和 root 的区别

    文章目录 一 语法说明 二 试验论证 三 经验总结 一 语法说明 alias 采用 alias 配置的资源目录必须是准确的 localtion 正则匹配到 path 后 直接在 alias 定义的目录下查找 采用 alias 标签配置资源路
  • 点击图片查看原图(图片按比例展示,点击旋转)

    使用layer弹框 实现点击图片查看原图的效果 引入layer 函数封装 点击图片查看大图 function showBigImage e let src e attr src let img new Image img src src l
  • 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色

    题目 给定一个包含红色 白色和蓝色 共 n 个元素的数组 nums 原地对它们进行排序 使得相同颜色的元素相邻 并按照红色 白色 蓝色顺序排列 我们使用整数 0 1 和 2 分别表示红色 白色和蓝色 必须在不使用库内置的 sort 函数的情
  • IOC(Inversion of Control 控制反转)

    控制反转是什么 简单的说 就是好莱坞原则 Don t call us we will call you 留下你的电话号码 我们有需求就会打电话给你 背景 我们知道在面向对象设计的软件系统中 它的底层都是由N个对象构成的 各个对象之间通过相互
  • EasyX实现贪吃蛇

    成品展示 文章目录 实现思路 代码实现 game h game cpp test cpp 实现思路 贪吃蛇的实现思路并不复杂 由于我们需要将数据展示在图形窗口上 因此就不需要之前那种用数组表示整个游戏地图的方法 贪吃蛇的蛇有X坐标和Y坐标
  • bazel在tensorflow中编译报错

    开始根据博文建议用了最新版的bazel 0 28 0 安装成功了 但在tensorflow编译 bazel build tensorflow tools graph transforms transform graph 报错 home ty
  • Python爬虫Scrapy框架IP代理的配置与调试

    在调试爬虫的时候 新手都会遇到关于ip的错误 好好的程序突然报错了 怎么解决 关于ip访问的错误其实很好解决 但是怎么知道解决好了呢 怎么确定是代理ip的问题呢 由于笔者主修语言是Java 所以有些解释可能和Python大佬们的解释不一样
  • SQL中的时间

    前言 Oracle MySQL Postgresql SqlServer中对于时间的处理是不同的 为了便于使用和区分 我在来列一下这常见的四种数据库中对于时间进行处理方式 目录 一 Oracle 1 dd mon yy转换为yyyy mm
  • 自己实现一个 atoi 函数

    atoi ASCII to integer 把字符串转换成整型数 情况一 输入的字符包含不是数字字符的字符 例如 123adc4 针对这种情况 我们只要加上判断就行了 只要遇到不是数字字符的直接返回 情况二 如果在数字字符前面有正负号又该怎