模拟实现atoi函数

news2024/11/23 13:33:17

请记住那些对你好的人,因为他们本可以不这么做 

文章目录

  • atoi函数介绍 
  • 模拟实现

  大家好,我是纪宁。

  atoi函数,它的功能是将数字字符转化为数字。我第一次见这个函数还是在大一上在刷蓝桥杯的时候,有一个关于回文数字的题,要解决将字符转化为数字的问题。白驹过隙,转眼间已经快大二了。这篇文章,纪宁就带你了解并实现atoi函数。

一、atoi函数介绍 

  atoi函数,可以将一串数字字符转化为数字。例如,可以将 "12345678" 转化为整形 12345678 。当字符串最前面有空格或者0的时候,atoi函数会自动将空格或者0删去,从第一个非0数字字符开始转化,直到遇见‘\0’或者非数字字符停止。

#include<stdlib.h>
#include<stdio.h>
int main()
{
	char str1[30] = { "0" };
	while ((scanf("%s", str1) != EOF))
	{
		printf("%d\n", atoi(str1));
	}
	return 0;
}

分别采用如下几种情况的输入对atoi函数的结果进行测试

  1.数字字符的前面有字符0

  2.数字字符前面有非数字字符

  3.数字字符前面有空格和字符0

  4.数字字符后面有非数字字符

  5.前面有字符0后面有负号

  6.只有负号和数字字符

  7.负号加数字字符加非数字字符

得到的结果如下

  根据上述测试结果,我们可以大致模拟atoi函数的实现。

二、模拟实现

  当我们模拟实现atoi函数的时候,最困难的就是处理掉一些函数处理异常字符只保留部分字符串的功能。

  当函数传过来的指针是空指针时,要进行断言;当函数传过来的字符串为空字符串时,要提示使用者:Abnormal Results(异常结果),再返回0,与正常返回结果是0的情况做区分;字符串的前半部分的空格和0都要在正常的 1~9 字符出现之前删掉,这部分用循环来完成;当正常数字字符串前面有符号时,要将符号转化为flag的正负来使用;当字符串前半部分有其他字符(字符+和字符-除外)时,直接返回0。

  数字字符串部分的处理:当程序识别出了即将开始进行字符串的转化时,还要保证开始之后的字符也为数字字符,在确保这写后,定义一个long long型的长整型,用来存放转化后的数字。当要转化大数字字符串转化为数字太大时,则也返回异常值0。

  解引用指针(*str)可得到数字字符,再用这个数字字符减去字符 ‘0’ ,就可以得到整形的数字,如此往复,经过简单的处理,则可得到数字字符串对应的整个整形数字,这个得到的数字就是正常值,返回即可。

  在判断返回的值是否是正常时,可以定义一个全局枚举类型变量,并将它的初值赋为 WRONG,如果正常转化成了数字,则再将枚举类型变量的值赋值为RIGHT。

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
enum JUD
{
	WRONG,
	RIGHT
}JUD=WRONG;
int my_atoi(const char* str)
{
	assert(str);
	int flag = 1;
	if (*str == '\0')
		return 0;
	while(*str == ' '||*str=='0')//处理空格
		str++;
	if (*str > '9' || *str < '0'&&*str!='-'&&*str!='+')
		return 0;
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
		str++;
	long long ret = 0;
	if (*str >= '1' && *str <= '9')
	{
		while (*str != '\0'&&*str>='0'&&*str<='9')
		{
			ret = ret * 10 + flag * (*str - '0');
			str++;
			if (ret<INT_MIN || ret>INT_MAX)
				return 0;
		}
	}
	JUD = RIGHT;
	return (int)ret;
}
int main()
{
	char str1[30] = { "0" };
	scanf("%s", str1);
	int ret = my_atoi(str1);
	if (JUD == WRONG)
		printf("Abnormal Results:%d\n",  ret);
	else
		printf("NOrmal Results:%d\n",  ret);
	return 0;
}

在这里插入图片描述

  博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰     裤    辣 !!!

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

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

相关文章

08.计算机网络——其他重要协议和技术

文章目录 DNSICMPNAT代理服务器 DNS DNS是一整套从域名映射到IP的系统 ​ TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是IP地址不方便记忆&#xff0c;于是人们发明域名&#xff0c;其本质是一个字符串&#xff0c;映射了它和IP地址的关系。 …

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)-附代码

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES) 文章目录 融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)1.秃鹰优化算法2.改进秃鹰优化算法2.1 基于纵横交叉策略2.2 基于惯性权重的位置更新2.3 黄金正弦捕食机制 3.实验结果4.参考文献5.Matlab代码6.python代码…

FreeRTOS-列表和列表项

列表和列表项&#xff1a; 列表是FreeRTOS中的一个数据结构&#xff0c;用来跟踪FreeRTOS中的任务。 列表项就是存放在列表中的项目&#xff0c;属于列表的子集。 列表就相当于一个链表&#xff0c;列表项就相当于节点&#xff0c;在FreeRTOS中的列表是一个双向的环形链表。 …

基于FPGA的视频接口之PAL(NTSC)编码

简介 PAL又称帕尔制&#xff0c;是咱们中国早期视频所是使用的视频广播模式&#xff0c;基本上现在的电视都兼容这种视频模式&#xff0c;使用的接口也是传统的BNC插头&#xff0c;有兴趣的伙伴可以看看电视屁股后面是不是有一个单独的BNC接口&#xff0c;百分之98就是支持PAL格…

FastReport.Net FastReport.Core 2023.2.23 Crack

FastReport.Net & FastReport.Core 2023.2.23适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可用于 Microsoft Visual Studio 2022 和 JetBrains Rider。 利用数据呈现领域专家针对 .NET 7、.NET Core、Blazor、ASP.NET、MVC、Windo…

【Windows】cmd和powershell命令合集

文章目录 1 前言2 一些规则3 cmd命令合集4 bat语法学习5 powershell命令合集6 powershell语法学习 1 前言 在日常使用过程中&#xff0c;总是会遇到不记得或无法区分cmd命令和powershell命令的情况&#xff0c;因为在Windows的工作大部分都是可视化的鼠标点击&#xff0c;用到命…

CLH自旋锁原理

CLH自旋锁 JUC中显式锁基于AQS抽象队列同步器&#xff0c;而AQS是CLH锁的一个变种。 在争夺锁激烈的情况下&#xff0c;为了减少CAS空自旋&#xff08;CAS需要CPU进行内部通信保证缓存一致性造成流量过大引起总线风暴&#xff09;&#xff0c;Java轻量级锁会升级为重量级锁&a…

大数据学习03-Hive分布式集群部署

系统环境&#xff1a;centos7 软件版本&#xff1a;jdk1.8、zookeeper3.4.8、hadoop2.8.5、hive1.1.0 一、安装 hive官网 下载hive安装包&#xff0c;上传到linux服务器上&#xff0c; 解压安装包 tar -zxvf apache-hive-1.1.0-bin.tar.gz -C /home/local/重命名文件 mv …

腾讯云轻量应用服务器搭建Typecho博客网站全流程

腾讯云轻量应用服务器自带Typecho应用模板镜像&#xff0c;腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统&#xff0c;并已预置Nginx、PHP、MariaDB软件程序&#xff0c;使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

C# 反转链表

206 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3…

Python中的标签编码和独热编码

在机器学习项目中&#xff0c;我们通常处理具有不同分类列的数据集&#xff0c;其中一些列的元素在有序变量类别中&#xff0c;例如列收入水平具有低&#xff0c;中或高的元素&#xff0c;在这种情况下&#xff0c;我们可以用1&#xff0c;2&#xff0c;3替换这些元素。其中1表…

【100天精通python】Day9:数据结构_字典、集合

目录 目录 1 字典 1.1 字典的基本操作示例 1.2 字典推导式 2 集合 2.1 集合的常用操作示例 3 列表、元组、字典、集合的区别 1 字典 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序的数据结构&#xff0c;用于存储键值对的集合。每个…

flask 读取文件夹文件,展示在页面,可以通过勾选删除

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import os import globapp Flask(__name__)app.route(/, methods[GET, POST]) def index():if request.method POST:to_delete request.form.getlist(checks)for file in to_delete…

Spring Security 的工作原理/总体架构

目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理&#xff08;类&#xff09; 2、FilterChainProxy 过滤器链代理&#xff08;类&#xff09; 4、SecurityFilterChain 安全过滤器链&#xff08;接口&#xff09; 5、Security Filters 安全过滤器实例 6、Sp…

解锁潜力,驭数赋能:大数据与云计算的强强联合

随着数字化时代的来临&#xff0c;大数据和云计算已成为信息技术领域的两大热门话题。大数据指的是以海量、高速、多样化的数据为基础&#xff0c;通过分析和挖掘来获得有价值的信息和洞察。而云计算则是一种基于网络的计算模式&#xff0c;通过将数据和应用程序存储在云端服务…

day31-Password Generator(密码生成器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day31-Password Generator&#xff08;密码生成器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&q…

Qt 之 自定义日志文件,QtMessageHandler应用

目录 一、前言 二、头文件代码 三、源文件代码 四、使用示例 五、使用效果 一、前言 在qt程序发布后&#xff0c;还需要查看一些调试输出信息&#xff0c;一般将输出信息写入日志文件&#xff0c;本文通过自定义函数实现将Debug、Warning、Critical、Fatal及Info信息自动输…

品牌全量数据监测分析

线上渠道众多&#xff0c;涉及的产品链接量也是巨大的&#xff0c;多数品牌在做线上数据监测时&#xff0c;是需要对全量数据进行监测分析&#xff0c;比如对某个SKU的全量数据&#xff0c;或者对某个竞品的全量数据进行监测&#xff0c;所以需求确认了&#xff0c;是否有能做到…

windows系统安装指定的vue/cli、node和npm;vue/cli脚手架搭建项目所涉及的vue/cli、node、npm依赖版本等问题

文章目录 前言一、安装vue/cli脚手架1.安装指定版本脚手架&#xff0c;我是用的3.12.0版本2.查看版本是否安装成功&#xff0c;成功有版本号2.1问题&#xff1a;安装失败2.2解决方案2.3 安装成功 二、安装指定node和npm1.为什么需要安装指定node和npm版本&#xff0c;同时匹配v…

【mysql】—— 表的操作

前言&#xff1a; 在上期中&#xff0c;我们把 mysql 中库的基本操作进行了相应的讲解。本期&#xff0c;我将给大家讲解的是关于mysql 中表的基本操作。 目录 &#xff08;一&#xff09;创建表 &#xff08;二&#xff09;查看表结构 1、DESCRIBE 方式 2、SHOW CREATE TA…