1、atoi()解析

atoi()原型: int atoi(const char *str );

函数功能:把字符串转换成整型数。

参数str:要进行转换的字符串

返回值:每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。

工作原理:atoi通过全局变量来区分返回0的情况。
如果是非法输入,返回0,并把这个全局变量设为特殊标志;
如果输入是”0”,则返回0,不会设置全局变量。

注意:使用该函数时要注意atoi返回的是int类型,注意输入str的范围不要超出int类型的范围。

#include <stdio.h>
#include <stdlib.h>int main()
{int a;char *ptr1 = "3124";char *ptr2 = "0";char *ptr3 = "12.33";char *ptr4 = "-1245";char *ptr5 = "+21";char *ptr6 = "s3241";a = atoi(ptr1);printf("\"%s\"\t-> %d\n",ptr1, a);a = atoi(ptr2);printf("\"%s\"\t-> %d\n",ptr2, a);a = atoi(ptr3);printf("\"%s\"\t-> %d\n",ptr3, a);a = atoi(ptr4);printf("\"%s\"\t-> %d\n",ptr4, a);a = atoi(ptr5);printf("\"%s\"\t-> %d\n",ptr5, a);a = atoi(ptr6);printf("\"%s\"\t-> %d\n",ptr6, a);return 0;
}

打印如下:

"3124"     -> 3124
"0"           -> 0
"12.33"    -> 12
"-1245"    -> -1245
"+21"       -> 21
"s3241"    -> 0

2、atoi()函数缺陷分析

从上述打印能够看出来,要是首字母是非法字母,及无法转换的类型,是输出为0的。这可能会造成灾难性的结果,因为不知道输入的是0,字符串还是非法字符串。

解决方案:可以加一个传参(变量)和主函数中switch语句判断转化错误的原因。(更好的解决方案)

比如工控上钻头移动坐标(x,y,z)。x,y,z三个坐标是靠服务器下发下来,若程序错误,传入了一个错误的结果(s12,3,4)(以字符串形式下发),如果直接调用atoi,必然解析成(0,3,4),移动到了错误的位置!

当然可以对输入的字符串进行检查,可为啥不在atoi里面检查呢?

3、aioi()函数改造

/*
用法:将字符串里的数字字符转化为整形数。并返回处理的字符个数。
注意:转化时跳过前面的空格等空字符,直到遇上数字或正负符号才开始做转换,
而再遇到非数字或字符串结束标志('/0')才结束转换,并将结果返回。
目的是改造atoi函数
处理失败或者没有整型字符串则返回0,处理成功发回处理字符串的个数
*/
int CM_Atoi(char* source,int* integer)//为了在被调用函数中修改其无法直接访问的实参的值
{int offset1,offset2,num;int signedflag;//+为1 -为0if(source == NULL || *source == '\0' ||integer == NULL){return 0;}offset1 = 0;//记录处理正负号的个数offset2 = 0;//记录处理数字的个数num = 0;while(*source > 0 && *source <= 32)//去除首部空格 \r \n \t \r 等异常字符,ASCII码值是32(含义为空格),ASCII码值是0(含义为空字符)。{source++;offset1++;}signedflag = 1;//默认为+if(*source == '+'){signedflag = 1;source++;offset1++;}else if(*source == '-'){signedflag = 0;source++;offset1++;}while(*source != '\0' && *source >= '0' && *source <= '9'){num = *source- '0' + num*10;source++;offset2++;if (num < 0)//整数溢出的情况,若溢出肯定变为负数{*integer = 0;return 0;}}if(signedflag == 0){num = 0 - num;}if(offset2){*integer = num;return offset1+offset2;}else{return 0;}
}

转发的整型已指针带入,返回转换的成功的字符串个数,应用层对CM_Atoi()函数返回值做检查,若返回为0,则比如转换失败,大于0,才成功转换成功。

4、atof()函数改造

同样方法对atof进行改造

/*
简单的x的y次幂
*/
long long pow1(int x,int y)
{long long num = 1;int i;for(i = 0; i < y; i++){num = num*x;}return num;
}/*
用法:将字符串里的数字字符转化为浮点型。并返回处理的字符个数。
注意:转化时跳过前面的空格等空字符,直到遇上数字或正负符号才开始做转换,
而再遇到非数字或字符串结束时('/0')才结束转换,并将结果返回。
目的是改造atof函数
处理失败或者没有浮点型字符串则返回0
支持正负号
*/int CM_Atof(char* source,double* doubleing)
{int offset1,offset2,n;double num;int signedflag;//+为1 -为0if(source == NULL || *source == '\0' || doubleing == NULL){return 0;}offset1 = 0;offset2 = 0;num = 0.0;while(*source > 0 && *source <= 32)//去除首部空格 \r \n \t \r 等异常字符,ASCII码值是32(含义为空格),ASCII码值是0(含义为空字符)。{source++;offset1++;}signedflag = 1;//默认为+if(*source == '+'){signedflag = 1;source++;offset1++;}else if(*source == '-'){signedflag = 0;source++;offset1++;}//整数部分while(*source != '\0' && *source >= '0' && *source <= '9'){num = *source- '0' + num*10.0;source++;offset2++;if (num < 0)//整数溢出的情况,若溢出肯定变为负数{*doubleing = 0;return 0;}}if(offset2 != 0 && *source == '.'){source++;offset2++;//小数部分n = 0;while(*source != '\0' && *source >= '0' && *source <= '9'){num = (*source- '0')*(1.0/pow1(10,++n)) + num;source++;offset2++;}}if(signedflag == 0){num = -num;}if(offset2){*doubleing = num;return offset1 + offset2;}else{return 0;}
}

————————————————
原文链接:https://blog.csdn.net/dingzj2000/article/details/89277497

atoi()函数解析以及缺陷分析,以及对atoi()、atof()的改造相关推荐

  1. C语言 atoi 函数解析

    文章目录 前言 atoi函数的介绍 atoi函数的使用 atoi函数的自我实现 附:C++完整无缺版自我实现 写在最后 前言 对于atoi函数大家可能会有些陌生,不过当你选择并阅读到这里时,请往下阅读 ...

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

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

  3. 【网络安全】Metasploit 生成的 Shellcode 的导入函数解析以及执行流程分析(1)

    2021 年 4 月,研究人员深入分析了 Cobalt Strike渗透测试技术,以及它的一些签名规避技术是如何在检测技术下失效的.在本文中,我们将深入讨论Metasploit,这是一个可以与Coba ...

  4. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  5. memcpy函数及其缺陷分析

    函数介绍 函数原型 void *memcpy(void *destin, void *source, unsigned n); 参数 destin-- 指向用于存储复制内容的目标数组,类型强制转换为 ...

  6. atoi函数详细分析

    atoi函数:将字符串转换为相应的整型数. isspace函数:检查是否为空格,跳格符(制表符或换行符),是则返回1,否则返回0. isdigit函数:检查是否为数字(0~9).是则返回1,否则返回0 ...

  7. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  8. json数据解析_VBA 实践指南 -- Split函数解析Json数据

    什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子 ...

  9. mysql 5.7 缺点_MySQL · 特性分析 · MySQL 5.7 外部XA Replication实现及缺陷分析

    MySQL 5.7 外部XA Replication实现及缺陷分析 MySQL 5.7增强了分布式事务的支持,解决了之前客户端退出或者服务器关闭后prepared的事务回滚和服务器宕机后binlog丢 ...

最新文章

  1. Wireshark如何选择多行
  2. sw标准件不能配置_思科设备与华为设备在配置Telnet,有啥不一样呢?
  3. POJ1816:Wild Words——题解
  4. rabbitmq 一些基本函数介绍
  5. java 多个类共用属性_java中读写Properties属性文件公用方法详解
  6. eclipse:解决修改文件需要重启tomcat问题
  7. mysql 修复错误连接_mysql 无法连接问题的定位和修复过程分享
  8. java链表list_java自定义List链表
  9. 贪心法——选择不相交区间
  10. UVA11760 Brother Arif, Please feed us!【bitset】
  11. oracle 1亿条数据,如何在十分钟内插入1亿条记录到Oracle数据库?
  12. EasyUI:form表单提交前验证
  13. 判断多边形是凹多边形还是凸多边形,以及求凹点
  14. 基于HTML的旋转立方体的实现
  15. CapAnalysis Pcap分析工具
  16. 爬取百思不得姐上面的视频
  17. freeMarker导出word带图片
  18. CSS-sprit 雪碧图
  19. 智能与人机融合智能的思考
  20. 零基础备考CFA一级-2019小成果之一

热门文章

  1. X32进程注入x64DLL到x64进程
  2. 暑假训练第四天,用python写校歌
  3. webrtc audio
  4. 前端小作业~小人动画案例
  5. mrtg监控短信报警 linux,mrtg监控网络流量简单配置
  6. Proxmox VE 7.2 LXC 方式部署openwrt
  7. 系统深度巡检(top命令)
  8. 在航天院做程序员,是一种什么体验?
  9. 硬件基础——模拟电路
  10. Android学习笔记五—简易新闻应用设计