C语言模拟实现atoi函数

2023-11-16

atoi函数,主要功能是将一个字符串转变为整数,例如将“12345”–>12345。但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方。

1.指针为NULL
2.字符串为空字符串
3.空白字符
4.正号与负号问题
5.溢出问题
6.异常字符处理

接下来看代码:(具体几种问题处理都在代码的注释中说明)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>

//定义两个枚举常量来表示状态
enum STATE
{
    VALID,  //合法
    INVALID,//非法
};
enum STATE state = INVALID;
int my_atoi(const char *str)
{
    int flag = 1;
    long long ret = 0;//定义为比int存储范围还要大的类型,防止后面判断溢出时出错。
    //空指针
    assert(str);
    //空字符串
    if (*str == "\0")
    {
        return 0;
    }
    //空白字符
    while (isspace(*str))//用函数isspace判断是否为空白字符
    {
        str++;
    }
    //遇到正负号
    if (*str == '-')
    {
        flag = -1;
        str++;
    }
    if (*str == '+')
    {
        str++;
    }
    //
    while (*str)
    {
        //if (*str >= '0'&&*str <= '9')
        if (isdigit(*str))//用函数isdigit判断是否为数字字符
        {
            ret = ret * 10 + flag*(*str - '0');
            //判断是否溢出
            if (ret > INT_MAX || ret < INT_MIN)
            {
                return ret;
            }
        }
        //异常字符
        else
        {
            break;
        }
        str++;
    }
    state = VALID;
    return ret;
}
int main()
{
    char *p = "12345";
    char *q = "  -12345";
    int ret = my_atoi(p);
    int ret2 = my_atoi(q);
    printf("%d\n", ret);
    printf("%d\n", ret2);
    system("pause");
    return 0;
}

运行结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言模拟实现atoi函数 的相关文章

  • qmake常用语法

    qmake常用语法 一 注释 用 注释 表示到行尾均为注释 二 include 包含别的文件 例如 include xx pri 类似于c 的 include 三 平台宏 win32 macx unix linux g 等 分别对应于win

随机推荐

  • HDU--1864:最大报销额 DP求最大和(最大和有上限)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1864 2 简要分析 这道题看起来不难 求最大报销额 想法是先找到符合要求的发票 然后求符合要求的发票的最大报销金额 但是 这道题的陷阱好几个
  • 【目标检测】3、SPPNet

    SPPNet Spatial Pyramid Pooling 空间金字塔池化 一般的CNN结构中 对输入大小要求固定 但在现实中通常会使用crop和warp来将大小统一 这样做会破坏图像的纵横比 何凯明提出了SPP 连接在最后一层卷积层 下
  • C++ 算法学习 之 sort

    这里写目录标题 sort函数 简单使用 通过上面的两个列子发现sort用的参数不一样为什么 进一步理解sort 那我们怎么进行自定义排序呢 力扣题目 c 官网手册 sort 参考于官网 sort函数 std sort 函数是C 标准库中提供
  • Python3.7+RobotFramework自动化测试框架环境搭建-重装

    Python3 7 RobotFramework自动化测试框架环境搭建 学习笔记 一 环境搭建 1 安装Python3 7 2 2 安装相关的库 request库 robotframework库 robotframework request
  • C++实现softmax函数(std::vector)

    参考博客 激活函数之softmax介绍及C 实现及其评论区 Lambda使用参考博客 C 11 Lambda表达式 函数功能 输入vector
  • CSS(三)

    目录 CSS三大特性 层叠性 继承性 优先级 层叠性 继承性 优先级 页面布局三大核心 盒子模型 浮动 定位 CSS盒子模型 网页布局过程 盒子模型组成 编辑 编辑 边框 border 内边距 padding 外边距 margin PS基本
  • 基于github搭建的个人博客

    刚开始我也是很不理解为什么要利用github hexo搭建博客 现在差不多能理解 首先逼格很高 其次用github搭建可以学习使用github并且空间很大 也可以便于交流 再次声明本篇是基于windows系统下搭建的博客 废话不多说开始 搭
  • 借助Redis锁,完美解决高并发秒杀问题

    目录 1 单机环境下的锁 2 分布式情况下使用Redis锁 3 一台服务宕机 导致无法释放锁 4 给每一把锁加上过期时间 5 延长锁的过期时间 解决锁失效 6 使用Redisson简化代码 场景 一家网上商城做商品限量秒杀 1 单机环境下的
  • JAVA-注册成功后,通过多线程发送短信的使用场景

    场景 在日常的系统中 使用前的第一步往往是需要注册 只有注册后获得登录账号和密码才能正常使用系统 有些系统在注册成功后 还会往用户的手机发送一条注册成功的短信通知 这个并不属于主线流程 也就是说发不发送该短信通知 用户都已经能登录系统了 那
  • mapbox创建自定义marker图标绑定弹框展示信息

    创建自定义marker图标绑定弹框 let carMarker 存放marker图标 for let m 0 m
  • 怎么查看本地服务器信息,查看本地服务器url地址

    查看本地服务器url地址 内容精选 换一换 OBS Browser 是一款用于访问和管理对象存储服务的图形化工具 支持通过配置内网DNS服务器地址的方式 使在华为云上的Windows ECS通过内网直接访问OBS 下面将介绍具体其操作流程和
  • Android EditText的setOnEditorActionListener方法——监听软键盘按键

    文章目录 1 控件EditText的setOnEditorActionListener方法的使用 2 android 软件盘事件响应 android imeOptions KeyEvent android inputType 2 1 Edi
  • 修改NuGet下载包后存放的默认路径

    NuGet默认下完包后就放在C盘 我们给他改一下 NuGet的默认目录配置文件在C Users yourName AppData Roaming NuGet NuGet Config 加一下这个配置 我放在了D盘 你可以看情况自己改
  • 【Hadoop技术篇】hadoop的使用

    博主介绍 博主介绍 大家好 我是淼淼 喵 很高兴认识大家 主攻领域 大数据开发 数据仓库 ETL 数据分析 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 欢迎评论 作者水平有限 欢迎各位大佬指点 相
  • 沐神《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly

    3 6 softmax回归的从零开始实现 运行 print evaluate accuracy net test iter 报了一溜错误 其中最后一行为 RuntimeError DataLoader worker pid s 5052 1
  • 包和 jar 文件的创建

    前言 在之前的文章中 讲到了面向的 3 大特性 封装 继承 多态 和面向对象设计的 5 大原则 SRP OCP LSP DIP ISP 此外 我们还讲了如何创建一个类 并且在创建类后如何构造一个对象 然后还介绍了类中的属性和方法 并对构造方
  • 方程组线性化方法和牛顿迭代法基础

    方程组线性化方法和牛顿迭代法基础 非线性方程组线性化和牛顿迭代法 参考书籍 GPS原理与接收机设计 谢钢 非线性方程 就是因变量与自变量之间的关系不是线性的关系 这类方程很多 例如平方关系 对数关系 指数关系 三角函数等等 求解此类方程往往
  • ESP-NOW:竟然还有如此好用的无线通信方式

    用 Arduino 玩转 ESP32 系列历史文章目录 ESP32 概述与 Arduino 软件准备 ESP32 GPIO接口编程入门 蓝牙翻页笔 蓝牙键盘与PPT 控制器 B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语
  • eclipse 关于报错Error creating bean with name ‘xxxxx‘: Invocation of init method....

    网上查找的资料是这种异常一般都是包导错了 缺失 冲突 版本错误都可能 由于再报这个错之前我进行了添加删除修改pom xml文件 右键项目 gt maven gt update project project gt clean等这些对于项目整
  • C语言模拟实现atoi函数

    atoi函数 主要功能是将一个字符串转变为整数 例如将 12345 gt 12345 但在实现过程中 我们难免会因为考虑不够全面而漏掉比较重要的几点 今天就总结一下实现atoi函数需要注意的地方 1 指针为NULL 2 字符串为空字符串 3