当前位置: 首页 > news >正文

C语言-atoi()库函数的模拟实现

文章目录

  • 前言
  • 一、atoi()库函数的介绍及使用
    • 1.1 atoi()库函数介绍
    • 1.2 atoi()库函数使用
  • 二、atoi()库函数的模拟实现
    • 2.1 函数设计
    • 2.2 函数实现思路
    • 2.3 具体实现
    • 2.4 测试
  • 总结


前言

本篇文章介绍c语言中库函数atoi()的使用,以及模拟实现库函数。


一、atoi()库函数的介绍及使用

1.1 atoi()库函数介绍

以下是cplusplus网站关于atoi()库函数的介绍。atoi()库函数
在这里插入图片描述
说明:

  • 首先,这个函数会将字符串前面的空格一一跳过,直到遇到非空格字符;这个非空字符分为以下情况

    • 如果非空字符为字母,则返回结果为0
      比如"abc123",转换得到0
    • 如果非空字符为’-',则会转换得到一个负整数且这个负整数没有超过int表示的范围,正常返回这个数;如果这个数超过了int型数据的表示范围,则返回-2147483648
      例如,
      “-12345”,转换得到整型数值-12345
      "-123456789123456"转换得到-2147483648
    • 如果非空字符为‘+’或者为数字字符,则会转换得到一个正整数且这个正整数没有超过int表示的范围,正常返回这个数;如果这个数超过了int型数据的表示范围,则返回2147483647
      例如,
      "+12345"转换得到整型数值12345
      "123456"转换得到整型数值12345
      "123456789123456"转换得到2147483647
  • 如果str指向的是一个空字符串或者只包含空格,则返回值为0.

  • 如果两个数字字符之间存在其他非数字字符,则转换非数字字符之前的数字字符。
    “123ab112”,只会转换得到整型数值123

1.2 atoi()库函数使用

  • 负数转换
    在这里插入图片描述

  • 负数溢出转换
    在这里插入图片描述

  • 正数转换
    在这里插入图片描述

  • 正数溢出转换
    在这里插入图片描述

  • 包含非数字字符
    (1)数字字符后面包含其他字符
    在这里插入图片描述

(2)数字前面包含非数字字符
在这里插入图片描述

  • 只包含非数字字符
    在这里插入图片描述

二、atoi()库函数的模拟实现

2.1 函数设计

函数名:StrToInt
函数返回值类型: int
函数参数类型: const char* str
int StrToInt(const char* str);

2.2 函数实现思路

  1. 函数指针的非空判断
//指针的非空判断 利用断言
assert(str);
  1. 空字符串的判断
//如果第一个字符为'\0',则表示字符串为空串
if('\0' == *str)
{return 0;
}
  1. 跳过字符串前面的空格字符
//利用库函数提供isspace()函数判断
while(isspace(*str)) str++;
  1. 正数和负数的判断
int flag = 1; //默认为正数
switch(*str)
{
case '-': flag = -1;
case '+': str++;
}
  1. 字符数字与整型数值的转换
//1.如果溢出判断使用long long
long long ret = 0;
while(isdigit(*str))  //isdigit()函数为库函数
{ret = 10*ret + flag*(*str - '0');//溢出判断if(ret > INT_MAX){return INT_MAX;}else if(ret < INT_MIN){return INT_MIN;}str++;
}
return  (int)ret;//2. 如果溢出判断不使用long long
int ret = 0;
while(isdigit(*str))
{int ConvertDigit = *str - '0';if((ret > INT_MAX/10) || ((INT_MAX/10 == ret) && (ConvertDigit > 7))){return flag > 0? INT_MAX:INT_MIN;}ret = ret*10 + ConvertDigit; str++;
}
return flag > 0 ? ret : -ret;

2.3 具体实现

  • 方法一(使用long long)
#include<assert.h>
#include<limits.h>
#include<ctype.h>
//version 1.3 
int StrToInt(const char* str)
{//1. 空指针判断assert(str);//2. 空字符串判断if ('\0' == *str){return 0;}//3. 去掉空格while (isspace(*str)) str++;long long ret = 0; //long long 用于判断转换结果是否超出int的表示范围int flag = 1; //用于判断是否为负数,默认为非负数//4. + - 判断switch (*str){case '-': flag = -1;case '+': str++;}//转换操作while (isdigit(*str)){ret = ret * 10 + flag * (*str - '0');//5. 溢出判断if (ret > INT_MAX){return INT_MAX;}if (ret < INT_MIN){return INT_MIN;}++str;}return (int)ret;
}
  • 方法二(不使用long long)
#include<assert.h>
#include<limits.h>
#include<ctype.h>// version: 1.4 
// 溢出判断不使用long long
// 1. ConvertDigit = *str - '0'   ->得到字符转换成的数字
// 2. ret = ret*10 + ConvertDigit ->得到计算的结果,默认为正数,最后根据符号返回结果  
// 3. (正数溢出判断) 上一次 ret > INT_MAX/10   
//				 说明下一次计算的ret >= INT_MAX		   则正数溢出
// (负数溢出判断) 上一次 ret == INT_MAX/10 && ConvertDigit > 7  
//				 说明下一次相加 ret >= INT_MIN的绝对值   则负数溢出
//  INT_MAX = 2147483647   INT_MIN = -2147483647-1
// 最后根据flag返回结果  flag > 0 返回INT_MAX  否则返回INT_MIN    
// 4. flag > 0  直接返回 ret   flag < 0 返回-ret
int StrToInt(const char* str)
{//1. 空指针判断assert(str);//2. 空串判断if ('\0' == *str){return 0;}//3. 清除空格while (isspace(*str)) str++;//4. 正负号判断int flag = 1;  //默认为正数switch (*str){case '-': flag = -1;case '+': str++;}//5. 转换int ret = 0;while (isdigit(*str)){int ConvertDigit = *str - '0';//溢出判断if ((ret > (INT_MAX / 10)) || (((INT_MAX/10) == ret) && (ConvertDigit > 7))){return (flag > 0) ? INT_MAX : INT_MIN;}ret = ret * 10 + ConvertDigit;str++;}return flag > 0 ? ret : -ret;
}

2.4 测试

  • 负数
    在这里插入图片描述

  • 负数溢出
    在这里插入图片描述

  • 正数
    在这里插入图片描述

  • 正数溢出
    在这里插入图片描述

  • 包含非数字字符
    (1)数字字符后面包含非数字字符
    在这里插入图片描述
    (2)数字字符前面包含非数字字符
    在这里插入图片描述


总结

本篇文章介绍了库函数atoi()的使用,并使用不同的思路模拟实现atoi()。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 摩尔投票法——代码实现及注释(力扣169题:找出列表中多数元素)
  • 源码编译安装LAMP
  • R可视化:另类的箱线图
  • Vue3实战笔记(47)— 一探emit奥秘——组件间通信的艺术与实践
  • React 微信扫码登陆网页
  • iOS推送证书过期处理
  • Java:String、StringBuffer和StringBuilder的区别
  • linux安装python第三方库情况
  • 防火墙基础基础篇:NAT转发功能之——Easy IP方式详解
  • dcache-android框架中的设计模式详解
  • 深圳比创达EMC|EMI电磁干扰行业:行业发展的关键与挑战
  • 汇编原理(二)寄存器——内存访问
  • 掌握SQL注入检测:深入理解SQLMAP工具
  • 成长之路Flutter中的TextField组件
  • 数据中台建设方案(Word版源文档)
  • 时间复杂度分析经典问题——最大子序列和
  • [译] 怎样写一个基础的编译器
  • 345-反转字符串中的元音字母
  • AWS实战 - 利用IAM对S3做访问控制
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • HashMap ConcurrentHashMap
  • Java多线程(4):使用线程池执行定时任务
  • JWT究竟是什么呢?
  • magento2项目上线注意事项
  • node.js
  • React+TypeScript入门
  • react-native 安卓真机环境搭建
  • SQLServer之创建数据库快照
  • storm drpc实例
  • uva 10370 Above Average
  • 仿天猫超市收藏抛物线动画工具库
  • 和 || 运算
  • 检测对象或数组
  • 马上搞懂 GeoJSON
  • 如何设计一个比特币钱包服务
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #数学建模# 线性规划问题的Matlab求解
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $L^p$ 调和函数恒为零
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (区间dp) (经典例题) 石子合并
  • (一)kafka实战——kafka源码编译启动
  • (转) Android中ViewStub组件使用
  • (转)Oracle存储过程编写经验和优化措施
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Family_物联网