目录

一,atoi函数的基本功能

1.1基本功能

1.2功能实现

二,模拟实现

2.1实现过程

2.2完整代码


一,atoi函数的基本功能

1.1基本功能

基本格式:int atoi(const char * str)

根据其基本格式,atoi函数的基本功能, 为将 str 指向的字符串转化为整形数。也就是将一个原先为一个包含整型数的字符串,将其内容中的整形数抠出来,单独返回,当然,既然是整形数,如果是负数,则会将符号也一起返回。

1.2功能实现

那么我们了解了其基本功能之后,我们通过一个例子观察该函数的功能:

#include<stdio.h>
#include<stdlib.h>
int main()
{char* p = { "   +1234sbc" };int ret = atoi(p);printf("%d\n",ret);return 0;
}

如上代码所示,字符串 p 在经过 atoi 函数的转换之后,输出如下:

我们看到,该函数只是将原字符串中的整形数转换了出来。当然,这里关于字符串可能会有很多种,所以可能会涉及到许多问题,那么我们通过接下来的模拟实现去更加仔细的去了解其实现原理。

二,模拟实现

那么首先,我们需要知道的是,对于字符串可能会有很多种,但是这里我们对于一些基本的。一般会用到的一些可能的字符串都做一个实现。

2.1实现过程

在整个分析之前,我们需要做的是,首先设置一个全局的枚举变量 state,然后将其初始值设置为非法的 INVALID,在之后,我们会将该值作为判断该字符串是否转换成功的标志。

正文如下:

首先,我们想到的是,如果 str 为空指针,此时可能会有问题,所以我们使用断言,来确定传递的指针不是空指针。

第二,如果指针不是空指针,而字符串的内容为空,此时我们认为这样是错误的,所以我们直接返回 0 ,表示这是异常返回。

第三,如果在我们要转换的整型数之前,有空格以及tab等符号的话,我们需要跳过这些字符,这里我们需要用到一个函数:isspace ,用以检测这些空格字符。实现如下图所示:

第四,如果在整型数之前遇到了负号,我们是需要在转换的时候加上的,但是如果是正号,我们默认是不加的,也即跳过即可。实现如下图,这里我们用了一个标识 flag ,如果正好遇到符合,我们则将其值设置为 -1 ,其集体功能在后面会用到:

第五,当我们了解了以上这些之后,接下来我们可能还会遇到不是整型数的字符,比如英文字母等,此时我们就需要使用一个函数,叫做整形数识别函数 isdigit ,该函数同 isspace 函数“一家”,都出自头文件 ctype.h 中。对于这两个函数来说,其参数均为指针类型,返回值均为整型。

第六,当然,不能忽略的是,如果字符串中可以转化出来的数是一个超过整型的数,那么我们认为其是不能转化的,所以也是错误的,故返回 0。到此为止,我们已经有两种情况需要返回 0 了。

这里我们将第五六条合起来作为一条,其实现如下所示:

那么,我们看到,在 isdigit 函数检查完之后,如果是整型数,接下来我们又出现一条实现整型数的计算的语句,通过 *str 减去 0 的ASCII码值之后,我们得到是处于当前 str 位置上的整型数的十进制数值,然后再原先检索到的该整型数的符号乘在该数上,最后通过整条代码,将该整型数求出。

如果之后一旦求得该数超过了整型数的大小,则强制返回 0 ,表示错误。

如果不是,直到将该字符串访问完,则进入 else 语句,将 枚举类型的变量state 置为正确返回的值 VALID。

好的,那么当我们考虑了上述这些之后,对于该函数的基本使用是没有什么问题的了。当然,我们也有一些问题没有考虑,但是对于我们日常使用来说,已经足够,所以我们不再考虑其他的东西了。

2.2完整代码

#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<ctype.h>
enum State
{INVALID,//异常  0VALID//正常 1
};
enum State state = INVALID;
int my_atoi(const char *str)
{//1.指针为NULLassert(str);//2.字符串内容为空if (*str == '\0')return 0;//异常返回//3.空格等while (isspace(*str)){str++;}//4.正负号int flag = 1;while(*str == '+' || *str == '-'){if (*str == '+'){flag = 1;str++;}else{flag = -1;str++;}}//5.非数字字符//6.字符串转换后的数组超过了最大整型数long long ret = 0;while (*str){if (isdigit(*str)){ret = ret * 10 + flag * (*str - '0');if (ret > INT_MAX || ret < INT_MIN){return 0;//异常返回}str++;}else{state = VALID;//合法返回return (int)ret;}}state = VALID;//合法返回return (int)ret;
}
int main()
{char* p = {"   -1234abc"};int ret = my_atoi(p);if (state == VALID){printf("转换后的正确值为:%d\n",ret);}else{printf("错误\n");}return 0;
}

那么对于完整代码,我们还需要对其做一些解释:

这里我们大概有两种返回方式:

第一种,是返回 0 ,这里返回 0 的同时,其实我们并没有改变 state 的值,因为这种情况我们认为是错误的,所以,最后 state 的值依然是初始值,所以结果为:错误。

第二种,是返回正常转换后的整型值,同时会将原有 state 的值更改为正常返回的值 VALID。

好的,以上就是我们对于 atoi 的功能以及其内容的具体分析,如有错误,还请各位指正呀!

atoi函数功能以及模拟实现相关推荐

  1. 【C语言】atoi函数的功能和模拟实现

    快速导航 1.atoi函数的功能 2.atoi函数的模拟实现 2.1初步模拟实现 2.2atoi函数的具体实现(考虑6种特殊情况) 1.atoi函数的功能  atoi函数功能是将数字字符串转换为整数: ...

  2. 【C语言】模拟实现atoi函数

    目录 前言 一.atoi()函数 二.模拟实现atoi 1.普通情况 2.空指针 3.前面有一大堆空格 4.字符串长度为0 5.整型溢出 6.含有其它类型数据 7.具体实现 前言 今天我们来模拟实现a ...

  3. 【C语言】详解atoi函数

    目录 一.什么是atoi函数 二.模拟atoi 一.什么是atoi函数 atoi函数是将字符串转换成整数. int atoi (const char * str); 该函数的返回值为int类型的整数, ...

  4. atoi函数的介绍和模拟实现

    今天我来介绍atoi函数和模拟实现atoi函数. 目录 atoi和与其功能相似的函数的介绍 atoi函数的模拟实现 atoi和与其功能相似的函数的介绍 atoi函数是一个将字符串转换为整数值的函数. ...

  5. 模拟实现atoi函数

    atoi函数原型为:int atoi( constchar *string ); 其功能是将一个数字字符串转换成int类型的整数,若数字前有空格,可以跳过空格. 模拟实现此函数,初看之下,觉得此题简单 ...

  6. C语言模拟实现:atoi函数

    在实现atoi之前我们先来了解一下atoi函数的作用是什么: 目录 1.实例演示 2.模拟实现 2.1 判断是否为空指针 2.2判断是否为空字符串 2.3判断正负号 2.4判断非数字字符 2.5判断是 ...

  7. 【atoi函数的介绍以及模拟实现】

    目录 前言 一.atoi函数测试 1. 要求 2. 测试 二.atoi函数模拟实现 三.补充 前言 位置: atoi函数包含在<stdlib.h>头文件中 作用: 将字符串转换为整形数据返 ...

  8. atoi函数的模拟实现

    文章目录 atoi函数: 模拟实现: atoi函数: 函数原型: 包含在在头文件<stdlib.h>中 该函数的的作用是把字符串中的数字字符转化为数字. 例如: 模拟实现: 首先我们要考虑 ...

  9. atoi函数和itoa函数以及模拟使用

    1.atoi函数 atoi函数的作用是把一个字符串换成一个整型数据,该函数包含于头文件#include<stdlib.h>中.     1.空字符返回数字0:     2.数字字符前有空白 ...

最新文章

  1. python 获取集合里面的某一个元素
  2. golang中的sync.WaitGroup
  3. 让你的照片更鲜艳------hsv拉伸
  4. 基于silverlight4(beta)的摄像头应用(Beta2)发布
  5. 绝对强大的三个LINUX指令: AR, NM, OBJDUMP
  6. 在ubuntu中使用MYBASE
  7. 基于Java+SpringBoot+vue+element实现校园闲置物品交易网站
  8. 把时间变成钱?可视化平台实时监控百万数据,决策分析不再等
  9. 8 PP配置-生产主数据-工作中心相关-定义工作中心负责人
  10. Verilog 常规数据定义
  11. 如何在阿里云里申请并使用免费https证书SSL、nginx下配置https证书
  12. 惠普HP Laser 108a 打印机驱动
  13. Python多字段排序之cmp_to_key详解
  14. MPU6050的数据获取、分析与处理
  15. 微积分memo——一元函数积分学
  16. 2021-12-11 【数据结构平时实验】【图】
  17. 从微信H5点击保存图片说起-微信图片下载
  18. 中专高一第一学期计算机应用期中基础考题,职业中专第一学期计算机应用基础WIN7和Word2010版期末考试题...
  19. tyflow雨滴在物体上滑落测试
  20. swr_convert音频重采样介绍

热门文章

  1. Mac下Nginx无法停止
  2. STC15单片机实战项目 - 新建工程(软件开发)
  3. uniapp h5直播拉流的几种方法 flv.js, video.js, 阿里播放器sdk,video标签
  4. 夏令营提高班上午上机测试 Day 3 解题报告
  5. Photoshop插件-晕影白色-脚本开发-PS插件
  6. 显著性检测数据集简单介绍及下载链接
  7. 不得不感叹浮选油消泡剂对付泡沫问题果真有一手
  8. C/C++-----对C语言文件的学习
  9. 【wamp+vscode+谷歌】VS编辑器保存,浏览器同步刷新
  10. 23计算机考研, 153所大学专业/科目变动集合!