【C进阶】模拟实现atoi函数

news2024/11/15 23:40:56

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C语言进阶
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

atoi函数

  • 前言
  • 一、简单介绍
    • (一)正负数
    • (二)空格侠
    • (三)非数字字符串
    • (四)数字字符串和非数字字符串结合
    • (五)其他情况
      • 1.空字符
      • 2.超出int范围
      • 3.NULL
  • 二、模拟实现
    • (一)解题思路
    • (二)解题代码
  • 总结


前言

模拟atoi函数是《剑指offer》里面的一道经典的面试题,因为这个函数看起来很简单,就是单纯的将数字字符转换为数字,可是真有那么简单吗?那答案肯定是否定的,这道题的难点在于如何避免空格、很大的数、非数字字符……这些情况,所以,大家要想搞懂,那就随我往后看吧!!!


一、简单介绍

我们打开MSDN查看一下:
在这里插入图片描述

(一)正负数

所以,这atoi函数就是将一个数字字符串转化为整数,那我们试一试先单纯用正数一试:在这里插入图片描述
那同样了,我们也需要试一试负数:在这里插入图片描述

(二)空格侠

如果说空格在数字字符前,中,后会是怎样的呢!?我们接下来看一看吧:
前:
在这里插入图片描述
中:在这里插入图片描述
后:在这里插入图片描述
如上图所示

(三)非数字字符串

那其实我们就有一个比较大胆的想法,我们传非数字字符串呢!?我们既然说了,这个abcd这些字符是在内存中以ASCII吗存储,那我们会不会输出的也是ASCII码值呢?那我们必须要试一试:在这里插入图片描述
给的是一个0,那就是不能将这些非数字字符串转换。

(四)数字字符串和非数字字符串结合

有同学问了,那这两个结合呢??要是结合会不会骗过这个IDE编译器呢?答案当然是不会的,如果你前面是数字字符串后面是非数字字符串,那只会打印前面数字字符串不会打印后面非数字字符串,而如果是前面是非数字字符串后面是数字字符串那就打印不了了,变成0了。
在这里插入图片描述
在这里插入图片描述

(五)其他情况

1.空字符

空字符最终输出的也是0:在这里插入图片描述

2.超出int范围

四不像的数:
在这里插入图片描述

3.NULL

会出现问题:
在这里插入图片描述


二、模拟实现

(一)解题思路

我们是需要遍历字符串,从左往右找数字字符,碰到空格就往后继续找,先找到数字字符就开始换算,一直到’\0’或者非数字字符为止停下,输出前面的数字字符转化为数字的值。那当然我们肯定会遇见的几种情况需要一一对应的解答,因为我们不知道什么时候才能找到正确的值,那我们就需要定义一个枚举类型进行解题,当成立的时候就是合法的,那我们直接往下看代码吧!

(二)解题代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
#include<limits.h>
//思路:遍历字符串,在'\0'之前的字符没有任何的问题且不超int就输出,
//如果有什么非法字符出现,就定义一个符号来进行定义合法与不合法
enum State {
	INVALID, //0
	VALID //1
};
//state记录的是my_atoi函数返回的值是合法转化的值还是非法转化的值
enum State state = INVALID; //非法情况多
int my_atoi(const char* s) {
	int flag = 1;
	//空指针
	if (NULL == s) {
		return 0;
	}
	//空字符串
	if (*s == '\0') {
		return 0;
	}
	//跳过前面空白字符
	//前面有空白字符先跳过空白字符,直到找到第一个数字字符再开始往后规划,这之后必须全是数字字符
	//while (*s == ' ') {
	//	s++;
	//}
	while (isspace(*s)) {
		s++;
	}
	//正负号问题
	if (*s == '+') {
		flag = 1;
		s++;
	}
	else if (*s == '-') {
		flag = -1;
		s++;
	}
	//处理数字字符的转换
	long long n = 0;
	while (isdigit(*s)) {
		n = n * 10 + flag * (*s - '0');
		if ((n > INT_MAX) || (n < INT_MIN)) {
			return 0;
		}
		s++;
	}
	if (*s == '\0') {//找到'\0'
		state = VALID;
		return (int)n;
	}
	else {
		//非数字字符的情况
		return (int)n;
	}
}
int main() {
	const char* p = "   -123abcd";//常量字符串不能被修改,所以加const
	int ret = my_atoi(p);
	if (state == VALID) {//正常转换
		printf("%d\n", ret);
	}
	else {//非法
		printf("%d\n", ret);
	}
	return 0;
}

总结

模拟实现的考虑确实非常非常的多,我们需要很多的分析和思考把这个模拟代码进行使用,搞懂一定是很重要的哦~~当我们很疑惑的时候,那肯定需要进行仔细看此代码和注解以及解析!!


客官,来个三连支持一下吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day21-多线程

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CP…

【数据结构】双链表实现

双链表实现双链表LinkedList的使用ArrayList 和 LinkedList的区别双链表 双链表的结点其实就是在单链表结点的基础上多了一个存储前一个节点地址的域&#xff0c;例如&#xff1a; 接下来就实现双链表的各种操作&#xff0c;首先定义好双链表的结构&#xff1a; public class…

【经典算法】双指针(尺取法):爱,是双向奔赴,还是你追我赶?

&#x1f451;专栏内容&#xff1a;算法学习随笔⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 目录一、前言二、左右指针&#xff08;双向奔赴&#xff09;1、定义2、回文检查三、快慢指针&#xff08;你追我赶&#xff…

将字符串代码编译为字节代码对象 compile()

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将字符串代码编译为字节代码对象compile()[太阳]选择题关于以下python代码表述错误的一项是?sx1y2print("xy",xy)print("【显示】s&#xff1a;")print(s)print("【执…

fpga实操训练(一个典型的fpga系统)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于刚学习fpga的同学来说,很多人可能一开始并不了解,一个典型的fpga系统应该是什么样子的。今天正好来熟悉一下。此外,我们也可以通过这个系统,从另外一个角度学习下,为什么要…

【蓝桥杯】简单数论——快速幂矩阵快速幂

1、快速幂 1.1运算模 定义&#xff1a;模运算为a除以m的余数&#xff0c;记为a mod m&#xff0c;有a mod m a % m。 模运算是大数运算中的常用操作&#xff1a;如果一个数太大&#xff0c;无法直接输出&#xff0c;或者不需要直接输出&#xff0c;可以把它取模后&#xff…

2.4总线操作和定时

文章目录一、引子二、介绍1.总线周期2.总线定时规范三、同步定时方式1.过程2.特点3.优缺点①优点②缺点四、异步定时方式1.介绍2.三种方式&#xff08;1&#xff09;不互锁方式&#xff08;2&#xff09;半互锁方式&#xff08;3&#xff09;全互锁方式3.优缺点①优点②缺点五、…

Allegro如何统计包含过孔长度的网络长度操作指导

Allegro如何统计包含过孔长度的网络长度操作指导 当需要统计网络长度的时候,可以通过element选择nets看到网络的长度,但是当网络换层了,并且需要统计到过孔的长度,类似下图 Allegro可以快速的统计网络的长度,并且包含过孔的长度 具体操作如下 选择Setup选择Constraint –…

设计模式 - 六大设计原则之SRP(单一职责)

文章目录概述CaseBad ImplBetter Impl1. 定义接口2. 职责分离-多种实现类3. 单元测试小结概述 单一职责原则&#xff08;Single Responsibility Principle&#xff0c; SRP&#xff09;又称单一功能原则&#xff0c;是面向对象的五个基本原则&#xff08;SOLID&#xff09;之一…

2022这一年

前言 一年过得好快啊&#xff0c;这个年终总结不知道该写点啥&#xff0c;所以一直到现在也没动笔。 但如果不写吧&#xff0c;总感觉少了点什么。就像过年守夜&#xff0c;反正我是每年都要等到凌晨12点放完鞭炮后才睡。 前些天也看到不少博主发布了2022年终总结&#xff0c;…

【ARM体系结构】之相关概念与公司简介

1、ARM相关的概念 机器码&#xff1a;计算机可以识别的0和1的组合。即高低电平的信号&#xff0c;1高电平信号&#xff0c;0低电平信号 汇编指令&#xff1a;编译器可以将汇编指令&#xff08;存在代码段&#xff09;编译成为机器码&#xff0c;执行汇编指令可以完成相应的汇编…

【进击的算法】基础算法——动态规划

&#x1f37f;本文主题&#xff1a;动态规划 &#x1f388;更多算法&#xff1a;回溯算法 &#x1f495;我的主页&#xff1a;蓝色学者的主页 文章目录一、前言二、概念2.1概念一&#xff1a;状态转移2.2概念二&#xff1a;Dp数组三、例题3.1斐波那契数列3.1.1题目描述3.1.2状态…

JQUERY总结(四)

对象拷贝&#xff1a; <script src"jQuery.min.js"></script> <script>$(function(){// var targetObj{};// var obj{// id:0,// name:"xinyi",// location:"henan"// };// //覆盖以前的相同key值对应的数据// $.…

【自然语言处理】基于NLP的电影评论情感分析模型比较

基于NLP的电影评论情感分析模型比较一段时间以来&#xff0c;使用机器学习的 NLP 任务借助 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型被认为是当前的黄金标准。这些模型通常用于我们日常的许多语言处理任务&#xff0c;比如谷…

Java面试题,线程安全问题

线程安全问题一、对线程安全的理解&#xff08;实际上是内存安全&#xff09;二、Thread类的继承、Runable接口的重写三、守护线程四、ThreadLocal原理和使用场景五、sleep、wait、join、yield六、线程池、解释线程池参数一、对线程安全的理解&#xff08;实际上是内存安全&…

JVM面试一

5. JVM 5.1 JVM包含哪几部分? 参考答案 JVM 主要由四大部分组成:ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎),Native Interface(本地库接口),下图可以大致描述 JVM 的结构。 JVM 是执行 Java 程序的虚拟计算…

【计算机组成原理】第一章 计算机系统概述

文章目录第一章 知识体系1.1 计算机发展历程1.1.1 计算机硬件的发展1.1.2 计算机软件的发展1.2 计算机系统层次结构1.2.1 计算机系统的组成1.2.2 计算机硬件1.2.3 计算机软件1.2.4 计算机的层次结构1.2.5 计算机系统的工作原理1.3 计算机的性能指标第一章 知识体系 1.1 计算机发…

35.Isaac教程--机械臂取放物体示例应用程序

机械臂取放物体示例应用程序 ISAAC教程合集地址文章目录机械臂取放物体示例应用程序使用 Omniverse 套件模拟驱动的机器人手臂启动取放示例应用程序该包为拾取和放置场景提供了一个应用程序脚手架。 它具有执行拾取和放置任务所需的高级步骤&#xff0c;并与两种类型的机器人操…

Java面试题,Spring与SpringBoot相关问题

Spring与SpringBoot相关问题1、BeanFactory和ApplicationContext有什么区别&#xff1f;2、描述一下Spring Bean的生命周期3、Spring的几种Bean的作用域4、单例Bean是线程安全的吗&#xff1f;5、Spring框架用到了哪些设计模式6、Spring事务的实现方式、隔离级别、传播行为7、S…

Lesson4--栈和队列

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 初始化栈 销毁栈 栈的扩容 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 判空 程序代码如下 Stack.h Stack.c test.c 2.队列 2.1队列的概念及结构 ​2.2队列的实现 初始化队列 队尾入队列 队头出队列 获取队列头部元素 获取…