【C语言】模拟实现 atoi

文章目录

  • 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

S2-066分析与复现

Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间&#xff0c;期间断断续续地写&#xff0c;直到最近才完成&#xff0c;o(╥﹏╥)o。羞愧地回顾一下官方通告&#xff1a; 2023.12.9发布&#xff0c;编号CVE-2023-50164&#xff0c;主要影响版本是 2.5.0-2.5.32 以及 6.0.…

国产AI插件StartAI PS平替之【局部重绘】

PS beta有创成式填充&#xff0c;StartAI有【局部重绘】【扩图】&#xff0c;国内设计师的好物推荐。图像延展填充这么做&#xff1f;StartAI【扩图】帮你填充图像&#xff0c;【局部重绘】帮你调整图像细节。 【局部重绘】适用于广告、摄影等图像领域。 原图 我们对图片中的…

最近公共祖先(Tarjin)

【模板】最近公共祖先&#xff08;LCA&#xff09; 题目描述 如题&#xff0c;给定一棵有根多叉树&#xff0c;请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N , M , S N,M,S N,M,S&#xff0c;分别表示树的结点个数、询问的个数和树根结点的序号…

十、MySQL主从架构配置

目录 一、资源配置 二、主从同步基本原理&#xff1a; 1、具体步骤&#xff1a; 2、数据库是靠什么同步的&#xff1f; 3、pos与GTID的区别&#xff1f; 三、配置一主两从 &#xff08;1&#xff09;为主库和从库创建复制账户&#xff0c; 分别在主从库上执行如下命令&a…

Chrome 114 带着侧边栏扩展来了

效果展示 manifest.json {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.2","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons"…

健康星球乃幸福源泉:AI如何助力拯救环境

地球、环境和自然是有机融入的&#xff0c;自形成以来就一直维持着自我。看似如此有机的东西无需技术&#xff0c;但随着地球上发生的各种变化&#xff0c;我们却可以寄希望于人工智能&#xff08;AI&#xff09;帮助地球重回正轨&#xff0c;迎接幸福健康的千年。全球目标业已…

Stable Diffusion之核心网络结构解析

Stable Diffusion核心网络结构解析 1. SD模型整体架构初识 1. SD模型整体架构初识 Stable Diffusion模型整体上是一个End-to-End模型&#xff0c;主要由以下三个核心组件构成。 VAE&#xff08;变分自编码器&#xff0c;Variational Auto-Encoder&#xff09;&#xff0c;U-N…

带你玩透浮动float布局,详解(一)

文章目录 一 认识浮动二 浮动的规则浮动的规则一代码展示 浮动规则二代码展示 浮动规则四代码展示代码展示 浮动规则五 空隙的解决方案代码展示:第一种方式 放在一行第二种解决方式&#xff08;不推荐使用这种方式&#xff09;第三种方式采用浮动&#xff08;推荐&#xff0c;统…

ESP-IDF 外设SPI驱动

本文只是对ESP32S3的SPI使用进行简单的介绍&#xff0c;主要讲解基于ESP-IDF的四线标准SPI的简单使用。并不涉及非固定长度结构体、dummy位的使用、高速SPI以及其它类型的SPI工作模式。 更加专业的内容可以参考&#xff1a;SPI 主机驱动程序 SPI简介 SPI&#xff08;serial …

【JS】替换文本为emjio表情

最终效果展示 T1 T2 T3 T4 需求 把评论你好帅啊啊啊[开心][开心]&#xff0c;[开心] 替换为图片 思路 正则match提取[开心]到一个数组数组去重创建img标签img标签转文本. 。例&#xff1a;&#xff08;el.outerHTML&#xff09;&#xff0c;将el元素转文本字符串replaceAll…

TikTok运营要用什么样的IP?怎么选择?

对于运营TikTok的从业者来说&#xff0c;IP的重要性自然不言而喻。 在其他条件都正常的情况下&#xff0c;拥有一个稳定&#xff0c;纯净的IP&#xff0c;你的视频起始播放量很可能比别人高出不少&#xff0c;而劣质的IP轻则会限流&#xff0c;重则会封号。那么&#xff0c;如何…

jQuery 选择器--获取元素

文章目录 1 jQuery 基础选择器2 层级选择器3 隐式迭代(重要)4 jQuery 筛选选择器5 jQuery 筛选方法(重点)案例--下拉菜单 6 jQuery 排他思想*案例--左右Tab栏切换 7 jQuery 链式编程 1 jQuery 基础选择器 2 层级选择器 3 隐式迭代(重要) 示例&#xff1a; 4 jQuery 筛选选择器…

万亿参数大模型网络怎么建?GTC 2024立了个标杆

​多年来&#xff0c;NVIDIA一直在面向AI的数据中心方面布局&#xff0c;随着大模型与生成式AI的到来&#xff0c;NVIDIA也为大模型AI智算中心立了个Flag&#xff0c;这就是黄仁勋近两年来经常挂在嘴边上的“AI工厂”。 早在2022年9月的GTC大会上&#xff0c;黄仁勋就预测数据…

MavenGit

Maven Maven的功能 1.管理jar包 2.Maven也支持编译、测试、打包发布和安装等功能 Maven的下载安装 1.Maven官方地址&#xff1a;Maven – Download Apache Maven 2.Maven的配置 1&#xff09;配置环境变量 2&#xff09;配置本地仓库 3&#xff09;配置镜像 关于pom.…

每日一题 --- 27. 移除元素 - 力扣 [Go]

移除元素 题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

视频素材库app哪里找?收藏以下短视频素材网站

嗨&#xff0c;视频创作达人们&#xff01;你们是不是在寻找那些高质量的视频素材库app&#xff1f;别担心&#xff0c;今天我就给你们推荐几个超棒的app&#xff0c;让你的视频创作更加出彩&#xff01; 蛙学网&#xff1a;视频素材库app推荐当然少不了蛙学网啦&#xff01;这…

图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积 力扣题目链接(opens new window) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff0…

一、Java中SpringCloud组件集成接入【Nacos服务管理】

一、Java中SpringCloud组件集成接入【Nacos服务】 1.Nacos介绍2.搭建Nacos服务2.1Windows部署2.2Linux和Docker部署 3.Nacos可视化操作4.Java集成Nacos5.常见问题5.1将nacos变量读取到程序中作为全局变量 6.参考文章 1.Nacos介绍 Nacos是一个开源的动态服务发现、配置管理和服…

pyvista可视化加强版

增加了一个随机按钮&#xff0c;可以即时切换case可视化 import os import glob import randomimport pyvista as pvdef display_multi_meshes(meshes: list, titlesNone, point_size3, opacity0.9):num len(meshes)for i in range(num):pl.subplot(0, i)if i 2:pl.add_che…

动态规划--子序列问题(一)

一.什么是子序列问题 我们之前已经学习过子数组问题,子数组问题最大的特点就是求一段连续区间的xxxx,子数组问题的经典的状态表示就是以i位置为结束,xxxx,推导状态转移方程的一个经验是根据数组的结构来区分不同的结构 子序列问题本质上是对子数组问题的一个拓展,或者说子序列…