《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi

2023-10-27

题目描述

编程实现字符串到整数的转换,例如输入字符串“123456”,输出整数12345

函数atoi

atoi 是把字符串转换成整型数的一个函数。包含在头文件stdlib.h中。
  函数原型:
  int atoi(const char *nptr);
  参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。
  

函数分析

  • 如果输入的字符包含不全是数字字符的字符。(例如:“123adc”.)

  • 如果在数字字符前面有正负号又该怎么处理。( 例如:”-123”、“+123”.)

  • 当输入的字符串前面几个字符都是空格怎么处理。(例如:“ 123”)

  • 当输入的字符串中没有数字时,我们应该返回什么呢?返回0合适吗?

  • 当字符串中的字符数字转化的整数太大,溢出问题怎么解决

  • 怎么区分返回的是非法的0,还是字符串装换的0呢?所以我们可以设置一个全局变量state,来记录合法和非法返回

代码实现


#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>
#include<limits.h>

enum State
{
    VALUE,//合法状态
    NOVALUE//非法状态
};
enum State state = NOVALUE;
int my_atoi(const char *str)
{
    int flag = 1;//标识正负数的
    long long ret = 0;
    assert(str != NULL);
    //空字符串,返回非法的0
    if (*str == '\0')
    {
        return 0;
    }
    //前面如果是空白字符,跳过,isspace函数判断字符是否为空格,如果是返回非0,如果不是,返回0
    while (isspace(*str))
    {
        str++;
    }
    if (*str == '+')
    {
        str++;
    }
    //处理负数
    else if (*str == '-')
    {
        str++;
        flag = -1;
    }
    while (*str)
    {
        //isdigit函数判断一个字符是否是数字,是返回非零,不是返回零
        if (isdigit(*str))
        {
            ret = ret * 10 + (*str - '0')*flag;
            //溢出问题
            if (ret > INT_MAX || ret < INT_MIN)
            {
                return 0;
            }
        }
        else
        {
            return (int)ret;
        }
        str++;
    }
    state = VALUE;
    return (int)ret;
}
int main()
{
    char *p = "     -123a";
    int ret=my_atoi(p);
    if (state == VALUE)
    {
        printf("%d\n", ret);
    }
    else
    {
        printf("字符串非法,无法转换\n");
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi 的相关文章

  • python枚举之Enum模块详解

    简介 当我们需要定义一些特定有限数量的常量 标签 类型等的时候 最佳方式就是使用枚举 枚举一般用于表示某些特定的有限集合 例如月份 季节 星期等 本篇主要介绍python2 7中的枚举类 即enum中的Enum类 python3 4开始有内
  • 终端显示 Git 当前所在分支

    1 进入你的home目录 cd 2 编辑 bashrc文件 vi bashrc 将下面的代码加入到文件的最后处 function git branch branch git branch 2 gt dev null grep sed e s
  • TCP select 轮询服务器

    include
  • [RequireComponent(typeof(....))]

    当某个脚本必须依赖其他脚本或者组件共同使用时 为了避免人为添加过程的操作失误 可以在代码中使用RequireComponent 它的作用就是添加该脚本时 会自动将所依赖的各个组件添加至gameobject上 避免人为操作的失误 例 Requ
  • 毕业季到了,用C/C++做一张表白图片吧

    一转眼又到了毕业季 大学里相伴四年之人也将各奔东西 这其中不乏你的好兄弟 好闺蜜 也有你暗恋许久的人 不如就趁这最后的时间 勇敢一次 用我们的专业技术做一张表白图片送给她 他 吧 目录 先看效果 一 原理 二 代码实现 1 首先我们需要安装

随机推荐

  • 其他引用形式(引用指针、引用数组)

    1 没有引用的引用 但有指针的引用 2 可以对数组进行引用 引用一般为左值引用 给已有的实例取别名 一般都是用一个 进行引用 很少使用 如果是两个 就不代表二级引用 代表的是右值引用 左右值得区分可看我别的文章那 下附链接 左值与右值 A
  • sqlplus命令

    1 登录 1 1 sqlplus nolog conn scott tiger 或 conn scott tiger 192 168 1 12 orcl 1 2 sqlplus scott tiger 1 3 sqlplus as sysd
  • 如何用U盘启动做系统启动盘,如何重装系统

    一般重装系统大多会使用镜像刻录工具 把iso镜像刻录到U盘 今天我们使用官方的工具来刻录U盘 首先我们要格式化U盘 然后进入windows下载官网 这里以win11为例 Win11 https www microsoft com zh cn
  • C++ 拷贝构造函数中的Private权限问题

    引言 在C 中 拷贝构造函数是用于创建一个对象的副本的特殊成员函数 拷贝构造函数通常被定义为公有成员函数 以便其他对象能够使用它来创建副本 然而 有些人可能会对拷贝构造函数能否访问私有成员变量产生疑问 本文将详细探讨C 拷贝构造函数中的Pr
  • 分享串口接收中断只能接收到一个字节的其中一个原因

    问题 今天来分享一个我这两天遇到的一个很狗血的问题 就是我在写一个新项目串口部分时候 发现串口怎么只能接收到一个字节 因为我用的是接收中断RBEN吗 每接收到一个字节都会中断一次 可是这次我发现我每次怎么只能收到一个字节 然后我调试了一遍发
  • 宇宙第一 IDE Visual Studio 要放弃 Mac 了

    当地时间 8 月 30 日 微软在其官网发文称 已经关停 Visual Studio for Mac 的开发 相关支持将于 2024 年 8 月 31 日结束 微软将继续支持最新版本的 Mac IDE 集成开发环境 根据相关通知 使用 NE
  • 遗传算法的matlab实现

    遗传算法 Genetic Algorithm GA 是20世纪70年代初兴起的一门新兴学科 遗传算法的基本思想来源于达尔文的进化论和孟德尔的遗传学说 它通过模拟生物进化的过程来求解问题 生物中的基因对应优化问题中的变量组合 一个解则代表了一
  • 数据结构与算法 学习摘要

    时间复杂度比较 O 1 lt O logn lt O n lt O nlogn lt O n 2 lt O n 3 线性表 栈 stack 后进先出 队列 queue 先进先出 链表 linkedlist 单链表 双链表 https git
  • Linux8 如何重启网络服务

    本文主要讲解如何重启RHEL 8或者CentOS 8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错 当我们安装好RHEL 8或者 CentOS 8 重启启动网络时 会出现以下报错 systemctl restart net
  • 板子接线图

    1 ST LINK V2接线 2 对抗板子刷蓝牙固件 接USB转TTL 用镊子短接两个孔 2 对抗板子用串口测试蓝牙AT命令 短接白色箭头 接TX RX 电源
  • 嵌入式开发面试中经常被问到的问题记录

    问题 你能介绍一下你最熟悉的处理器架构及其特点吗 在嵌入式开发中 你通常使用哪些编程语言 对于不同的应用场景 如何选择适合的编程语言 请描述一下您在项目中遇到的最具挑战性的问题 并解释您是如何解决这个问题的 如何设计和实现一个多线程嵌入式系
  • JavaScript:从入门到精通总结二

    7 代码块 1 代码块只有分组的功能 代码块内部的内容 外部完全可见 2 prompt 弹出提示框 并且该提示框会带有一个文本框 返回值是string类型 3 switch语句中条件表达式是进行全等比较 4 可以为循环语句创建一个label
  • spring-data-JPA repository自定义方法规则

    Spring Data JPA框架在进行方法名解析时 会先把方法名多余的前缀截取掉 比如find findBy read readBy get getBy 然后对剩下的部分进行解析 假如创建如下的查询 findByUserDepUuid 框
  • Linux系统管理(五)企业存储的基本管理

    目录 一 设备识别 二 设备挂载 三 设备中文件的查找 四 分区 五 swap分区 六 磁盘配额 一 设备识别 添加硬盘 设备接入系统后都是以文件的形式存在 设备文件名称 串口硬盘 SATA SAS USB dev sda dev sdb
  • 文件共享 无法访问,你可能没有权限使用网络资源,请与这台服务器的管理员联...

    文件或文件夹设置成共享之后 通过 运行 如运行 gt 192 168 0 123 进行访问 报错 192 168 0 123无法访问 你可能没有权限使用网络资源 请与这台服务器的管理员联系 这问题碰到好几回了 每次都是同事帮忙解决的 这次又
  • 什么是xxl-job?

    xxl job是一款开源的分布式任务调度框架 主要用于解决大规模分布式任务的调度和执行问题 它提供了任务调度中心 执行器和任务日志等组件 可以实现任务的定时调度 动态添加和删除任务 任务执行情况的监控和日志记录等功能 xxl job的作用主
  • HTML <ul> 标签

    实例 无序 HTML 列表 ul li Coffee li li Tea li li Milk li ul ul 标签定义无序列表 浏览器支持 元素 Chrome IE Firefox Safari Opera ul Yes Yes Yes
  • cad汉仪长仿宋体_长仿宋体字体下载 cad工程机械绘图工程制图国标字体下载

    做CAD很多时候要用到国标字体 CAD制图上用的国标字体一般就是长仿宋体 特此小编给大家分享 ttf格式的cad工程机械绘图工程制图国标字体下载 长仿宋体字体一般是专门用来做cad工程机械绘制效果图中使用 希望大家喜欢 界面预览图 在很多专
  • zlib库自定义接口封装

    zlib库自定义接口封装 zlib封装类说明 编译zlib库 编译自定义接口静态库 测试代码 代码 文件链接 zlib封装类说明 实现对文件以及文件夹的压缩解压缩 zip unzip h ifndef ZIP UNZIP H define
  • 《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi

    题目描述 编程实现字符串到整数的转换 例如输入字符串 123456 输出整数12345 函数atoi atoi 是把字符串转换成整型数的一个函数 包含在头文件stdlib h中 函数原型 int atoi const char nptr 参