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

【C语言】atoi函数的模拟

atoi对于初学者来说大概率是一个陌生的函数
但不要害怕,我们可以通过各种网站去查询
例如:
cplusplus就是一个很好的查询网站

目录

  • 函数介绍
  • 模拟实现
    • 需要注意的点

函数介绍

在这里插入图片描述
我们发现这是一个将字符串转换为整形数字的函数

例如:

int main()
{char str[] = "1234";int ret = atoi(str);printf("%d\n", ret);return 0;
}

在这里插入图片描述
在遇到不同字符串会有不同处理方法:

  1. 该函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。

  2. 从这个字符开始,接受一个可选的初始加号或减号,后面跟着尽可能多的以10为基数的数字,并将它们解释为数值。

  3. 字符串可以在组成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。

  4. 如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或仅包含空白字符而不存在这样的序列,则不执行转换并返回零。

模拟实现

模拟实现时我们就可以根据不同的处理方法进行操作
注意:

因为当你输入一个“a”时,输出为0
当输入一个“0”时,同样为一个0
故需要进行判断是否为一个合法的或是非法的
可以运行enum进行判断

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<stdlib.h>
//atoi模拟
enum Judge
{VALID,INVALID
}judge=INVALID;int my_atoi(char* str)
{assert(str);//判断指针是否为NULLint len = strlen(str);//判断是否为空字符串if (len == 0){return 0;}//将空格跳过while (isspace(*str)){str++;}//进行正负号的判断,注意如果原字符串可能不带符号,故初始化为1int flag = 1;if (*str == '+'){flag = 1;//判断完正负号要进行++跳到下一个字符str++;}else if(*str == '-'){flag = -1;str++;}long long ret = 0;//注意溢出while (*str){if (isdigit(*str)){ret = *str - '0' + ret * 10;//计算新的ret的值的式子if (ret > INT_MAX || ret < INT_MIN)//判断是否超出int的最大范围{if (flag == 1)return INT_MAX;elsereturn INT_MIN;}str++;}elsereturn flag * ret;}//运行到这时肯定是合法的judge = VALID;return flag * ret;
}

需要注意的点

  1. 我经常性的写数组时忘记带[],导致程序出错

  2. 在进行判别正负号时为了省事没有进行'-'判断,导致如果没有符号时程序出错

	if (*str == '+'){flag = 1;str++;}else{flag = -1;str++;}

欢迎纠错与改正

http://www.lryc.cn/news/191268.html

相关文章:

  • JAXB 使用记录 bean转xml xml转bean 数组 继承 CDATA(转义问题)
  • Linux Centos安装Sql Server数据库,结合cpolar内网穿透实现公网访问
  • Vulnhub系列靶机---Raven: 2
  • 计算机视觉与深度学习 | 视觉惯性SLAM的基础理论
  • [电源选项]没有系统散热方式,没有被动散热选项
  • 房产中介租房小程序系统开发搭建
  • RS485电路设计
  • 分布式文件服务器——Windows环境MinIO的三种部署模式
  • 科技资讯|9月新能源汽车零售74.3万辆,充电桩迎来发展高峰
  • 【C++ Primer Plus学习记录】指针——小结
  • Android Studio for Platform (ASfP) 使用教程
  • 【安全】linux audit审计使用入门
  • 如何优雅的终止 Docker 容器
  • SXSSFWorkbook-MinIo-大数据-流式导出
  • 使用PyQt5创建图片查看器应用程序
  • 怎样制作一个展会场馆预约小程序
  • 呼叫中心系统信息发送功能的应用
  • Android笔记(三)多Activity活动的切换中的简化处理
  • vue打包压缩
  • Mysql5.7大限将至升级Mysql 8.0过程记录(未完)
  • 多架构环境下docker-compose部署rocketmq单机模式—— 筑梦之路
  • [Unity][VR]Passthrough2-创建一个基本的Passthrough应用
  • 【Unity3D赛车游戏制作】设置面板搭建——UGUI复合控件
  • 如何让 Source Insight 识别 AUTOSAR 宏定义 FUNC
  • sts搭建springboot
  • 解决react使用css module无法重写bootstrap样式的问题
  • 自动驾驶软件和人工智能
  • 堆叠、集群技术
  • SpringCould微服务保护01——Sentinel组件下载并使用
  • 可扩展性对物联网管理系统有哪些影响?