【C语言】模拟实现 atoi

news2024/9/24 11:32:57

文章目录

  • atoi()函数
  • 模拟实现
  • 思路分析
  • 代码呈现


atoi()函数

在这里插入图片描述
在这里插入图片描述

通过上述cplusplus和MSDN对atoi函数的介绍我们可以得出以下几个关键点

  • 库函数: <stdlib.h>
  • 形参:const char * str
  • 返回值: int
  • 作用:atoi函数是将一个字符串转化成一个整型并忽视字符串中的字符

举个例子

/* atoi example */
#include <stdio.h>      /* printf, fgets */
#include <stdlib.h>     /* atoi */

int main ()
{
  int i;
  char buffer[256];
  printf ("Enter a number: ");
  fgets (buffer, 256, stdin);
  //fgets的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。
  i = atoi (buffer);
  printf ("The value entered is %d. Its double is %d.\n",i,i*2);
  return 0;
}

在这里插入图片描述


模拟实现

我们先整理一下cplusplus中 atoi 函数可能会发生的一些情况

  1. 分析 C 字符串 str,将其内容解释为整数,该整数以 type int 的值返回。
  2. 该函数首先根据需要丢弃尽可能多的空格字符( isspace)直到找到第一个非空格字符。然后,从此字符开始,采用可选的初始加号或减号,后跟尽可能多的以 10 为基数的数字,并将它们解释为数值。
  3. 字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
  4. 如果 str 中的第一个非空格字符序列不是有效的整数,或者由于 str 为空或仅包含空格字符而不存在此类序列,则不执行转换并返回零。

思路分析

  • 第一步
    通过循环将纯以10为基础的数字字符串转换为数字
    因为输入的是字符,直接输出数字会转换为ASCII输出(字符1的ASCII码为49)
    所以我们可以通过输出的数字剪掉字符0来得到最终数字
int s = 0;
while(*str != '\0')
{
	s = s * 10 + *str - '0';
	str++;
}
  • 第二步
    遇到空格符号、字符或其他类型时跳过
    我们只需要用到 isdigit 函数判断是否为数字就行

  • 第三步
    开头符号问题
    我们需要先循环掉一个字符前的所有空格,在判断出现的第一个字符是否为正负号,并通过flag来记录

  • 第四步
    判断字符指针是否为野指针,或者里面没有数据
    存在这种情况时直接退出,并输出0

  • 第五步
    字符类型转整形,存在整形溢出的情况,需要定义为long long
    同时因为我们要将字符串转化成整型,既然是整型,那么必然就会有范围,在头文件limits.h中有定义,我们就可以直接调出最大值最小值,如果这个数字大于INT_MAX或者小于INT_MIN就会返回0


代码呈现

具体步骤为

  1. 是否为野指针
  2. 是否为空指针
  3. 去除开头连续空格
  4. 判断正负号
  5. 是否为数字
  6. 判断是否超出整形范围
  7. 跳过非数字类型
  8. 判断这次转换是否非法(空指针、野指针)
#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include<stdio.h>//大哥
#include<assert.h>//断言,判断是否为野指针
#include<limits.h>//INT_MAX和INT_MIN的头文件







enum Status
{
	VALID,  //0
	INVALID //1
}status = INVALID;


int my_atoi(const char* str)
{
	assert(str);//判断是否为野指针
	
	long long s = 0;

	if (*str == "\0")//判断字符是否为空
		return 0;
	while (*str == ' ')//循环掉所有的空格
	{
		str++;
	}



	int flag = 1;//判断正负
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
		
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
		



	while (*str != '\0')//开始记录
	{
		if (isdigit(*str))//判断是否为数字
		{
			s = s * 10 + flag * (*str - '0');//正数累加,负数累减
			if (s > INT_MAX)
			{
				s = INT_MAX;
				break;
			}
			else if (s < INT_MIN)
			{
				s = INT_MIN;
				break;
			}
		}
		

		str++;

		
	}

	if(*str == '\0')//如果成功运行到最后一位就算完全字符转数字
		status = VALID;


	return (int)s;


}



//模拟实现atoi
int main()
{
	char a[] = "123456acd123";
	int b = my_atoi(a);
	if (status == INVALID)
		printf("非法转换:> %d", b);
	else
		printf("合法转换:> %d", b);

	return 0;
}

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

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

相关文章

运维篇SHELL脚本实战案例

统计出每个IP的访问量有多少&#xff1f; 检查是否提供了日志文件的路径作为参数。使用awk从日志文件的每行中提取第一个字段&#xff08;假设这是IP地址&#xff09;。使用sort对提取的IP地址进行排序。使用uniq -c统计每个唯一IP地址的出现次数。最后&#xff0c;使用sort -…

Python模块-基础知识

Python模块-基础知识 1.模块分类&#xff1a; &#xff08;1&#xff09;自定义模块&#xff1a; 如果你自己写一个py文件&#xff0c;在文件内写入一堆函数&#xff0c;则它被称为自定义模块&#xff0c;即使用python编写的.py文件 &#xff08;2&#xff09;第三方模块&…

从0到1:Java构建高并发、高可用分布式系统的实战经验分享

文章目录 引言基础架构选择与设计微服务架构分布式储存与计算 高并发处理策略异步处理与消息队列并发控制与资源隔离 高可用性设计与故障恢复冗余与集群化容错与自我修复监控与运维自动化 引言 随着互联网业务的快速发展和技术迭代升级&#xff0c;作为Java架构师&#xff0c;…

springboot企业级抽奖项目业务一(登录模块)

开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…

虚拟内存页表和内存保护

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第21篇&#xff0c;在这里分享给大家&#xff0c;这篇文章讲虚拟内存和内存之间的页表和内存安全问题。 虚拟内存 前面的文章提到过&#xff0c;程序装载到内存的过程。可以知道&#xff0c;程序并不直接访…

爬虫实战-Python爬取百度当天热搜内容

爬虫实战-Python爬取百度当天热搜内容 学习建议学习目标预期内容目标分解热搜地址热搜标题热搜简介热搜指数小总结 代码实现总结 学习建议 本文仅用于学习使用&#xff0c;不做他用&#xff1b;本文仅获取页面的内容&#xff0c;作为学习和对Python知识的了解&#xff0c;不会…

如何使用Net2FTP+cpolar搭建专属文件共享站点并实现无公网IP远程访问——“cpolar内网穿透”

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

MySQL高级学习笔记

1、MySQL架构组成 1.1 高级MySQL介绍 什么是DBA&#xff1f; 数据库管理员&#xff0c;英文是Database Administrator&#xff0c;简称DBA&#xff1b; 百度百科介绍 数据库管理员&#xff08;简称DBA&#xff09;&#xff0c;是从事管理和维护数据库管理系统&#xff08;D…

ISIS骨干网连续性简述

默认情况下&#xff0c; 一、L1路由器是ISIS 普通区域内部路由器&#xff0c;只能与L1和L1-2路由器建立邻接关系&#xff0c;不能与L2路由器建立邻接关系。 二、L2路由器是骨干区域的路由器&#xff0c;L2路由器只能与其他 L2路由器同处一个区域&#xff0c;可与本区域的L2路由…

分布式系统的基本特性

一般&#xff0c;分布式系统需要支持以下特性&#xff1a; 资源共享 开放性 并发性 可伸缩性 容错性 透明性 下面分别讨论。 容易理解的 资源共享 一旦授权&#xff0c;可以访问环境中的任何资源。 资源&#xff1a;包括硬件(e.g. printer, scanner, camera)、软件&a…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…

机器视觉学习(六)—— 图像的颜色识别

目录 一、色彩空间 1.1 RGB色彩空间 1.2 HSV色彩空间 1.3 灰度 1.4 CMYK色彩空间 1.5 Lab色彩空间 二、色彩空间转换 三、识别颜色 3.1 识别一种特定的颜色 3.2 识别多种颜色 一、色彩空间 计算机视觉中常用的色彩空间有RGB色彩空间、HSV色彩空间、CMYK色彩空间、La…

windows DCMTK编译使用(qt) 医学图像

由于项目需要生成DICOM格式的图片&#xff0c;需要使用到第三方开源库DCMTK&#xff0c;于是研究了一番&#xff0c;该库是C编写的&#xff0c;DICOM主要用于医疗体系中&#xff0c;除了可以保存图片信息外&#xff0c;还可以储存患者信息&#xff0c;病例信息&#xff0c;医疗…

如何修复WordPress网站媒体库上传文件失败的问题

公司最近推出了一系列新产品&#xff0c;为了更新网站的视频和图片&#xff0c;我们需要将它们上传至网站媒体库。然而&#xff0c;在上传视频时&#xff0c;我们却遇到了一些问题。系统提示说&#xff0c;我们尝试上传的视频文件大小超出了站点的最大上传限制。尽管我们的视频…

vue3中使用cesium

vue3中使用cesium Cesium是一个开源的JavaScript库&#xff0c;专门用于创建3D地球和2D地图的Web应用程序。它提供了丰富的功能和工具&#xff0c;使得开发人员能够轻松地构建出高质量的地理空间可视化应用。 1. 安装cesium包 npm install cesium2. 复制node_modules中的Ces…

Java IO流(超详细!)上篇

目录 一、File类1、操作文件和目录 二、I/O流概述1、按流向划分&#xff1a;输入流和输出流2、按处理单元划分&#xff1a;字节流和字符流3、按流的角色划分&#xff1a;节点流和处理流 三、字节流1、字节输出流基类&#xff1a;OutputStream2、字节输出流FileOutputStream类3、…

通过fail2ban服务监控frps日志实现禁止非法IP

前言 服务器使用了frp作为了内网穿透软件&#xff0c;查看frps的日志&#xff0c;发现总有一些国外的ip在扫描这台服务器的端口信息&#xff0c;日志如下图&#xff0c;所以想通过fail2ban服务能够直接禁用这些ip扫描服务器。 1、安装fail2ban服务 yum install -y fail2ban2、…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

解决idea粘贴空格时显示NBSP的问题并且在Registry中找不到editor.show.special.chars

1、解决java 复制代码NBSP问题 参考文章 原因&#xff1a;2020.2版本以后无法找到以上的选项来解决问题&#xff1b;之后的版本这个选项换地方了 解决办法&#xff1a;在设置中找到Advanced Settings&#xff0c;把Render special characters前面的对勾取消掉就好了。

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…