atoi函数(c语言)

2023-11-03

目录        

                atoi函数的说明

                函数改编以及思路

                代码

                代码注释 


  atoi函数的说明

该函数的作用是将一字符串变为一整型类型的数字输出出来,若字符串内无数字则输出0,此处输出按十进制输出。字符串开头的空格会自动扫描为空 ,

  函数改编以及思路

对该函数的实现我们进行深入一步的改变,若看懂了改变后的思路便可以轻松看懂该库函数的源码。

my_atoi函数:字符串转换为整型数字:

输入 输出
123 123
-123 -123
+123 123
++---123 -123
   -----123 -123
   123wef345 123
afeef123fwf35 0

 我们来分析上面表格:首先输入数字可以直接进行输出,前面为负号,则输出为负数,可以多输入正负号,我们通过负负得正的计算公式进行计算,紧接着若前面为空格,则无视空格,直接进行数字转换,若数字中间有其他字符,则直接输出字符前面的数字,字符串最前面是正负号和空格数字之外的其他字符,直接输出0;

通过以上分析,我们可以得到以下规律:

1)字符串最前面应该为数字,正负号,空格三个字符,其他均输出0;

2)数字前的正负号遵循负负得正的公式;

3)数字中不能存在其他字符,否则输出其他字符前面的数字;

思路:首先我们要直到字符串如何输出为整型数字——例如123这个数字,我们首先应该算出数字的位数,然后再算出数字,然后乘以10的长度减n次方,也就是进制转换 123=1*10^2+2*10^1+3*10^0;

解决了这个问题,我们分析正负号的问题,很显然我们根据负负得正的公式计算,不需要直到正号的个数,只需要算出负号的个数,如果负号为奇数个,则输出负号,若为偶数则直接输出数字,

然后我们看数字前后空格,其他字符类等问题,字符串刚开始前面只能是空格或者正负号和数字,但是数字有局限性,如果开始有数字那么后面字符串只要不是数字直接输出前面的数字,很显然,我么计算的正负号的个数是在数字之前的前提下进行计算。

代码:

#include<string.h>
#include<math.h>
#include<ctype.h>
#define assert
#include<stdlib.h>

void getbit(char *arr, int *count1, int *count2){
	bool fase = true;)
	while (*arr == ' ' || isdigit(*arr)||*arr=='+'||*arr=='-'){
		if (isdigit(*arr)){
			while(isdigit(*arr)){
				(*count1)++;
				arr++;
				fase = false;
			}

		};
		if (!fase) break;
		if (*arr == '-')    (*count2)++;
		arr++;
	}
}
int atoi(char*arr){
	int count1 = 0,count2=0;
	int len = strlen(arr);

		if (isdigit(*arr) || *arr == '+' || *arr == '-' || *arr == ' ')
			getbit(arr, &count1,&count2);
		else return 0;
		int result = 0;
		while (*arr == ' ' || isdigit(*arr) || *arr == '+'||*arr=='-'){
			if (isdigit(*arr))  {
				while (isdigit(*arr)){
					result = result + ((*arr - '0')*(int)pow(10, (double)count1 - 1));
					count1--;
					arr++;
				}
				break;
			}
			arr++;
			
		}if (count2 & 1) return -1*result;
		else 	
		return result;

}
int main() {
		char arr[] = "  -545";
			int result = atoi(arr);
		  printf("%d\n", result);
}

代码讲解以及注释:

#include<string.h>
#include<math.h>
#include<ctype.h>
#define assert
#include<stdlib.h>

void getbit(char *arr, int *count1, int *count2){//计算数字以及正负号的个数
	bool fase = true;//标记(在找到数据之后不能有其他字符,此为退出循环的标记)
	while (*arr == ' ' || isdigit(*arr)||*arr=='+'||*arr=='-'){//字符串刚开始的限制
		if (isdigit(*arr)){//找到第一个数字开始计算数字个数
			while(isdigit(*arr)){
				(*count1)++;
				arr++;
				fase = false;//有了这个标记,退出小循环之后便可以直接退出循环
			}

		};
		if (!fase) break;//找到数字之后,后面只要不是数字直接可以不用继续遍历
		if (*arr == '-')    (*count2)++;//计算数字之前负号的个数
		arr++;
	}
}
int atoi(char*arr){
	int count1 = 0,count2=0;//有效数字的个数
	int len = strlen(arr);

		if (isdigit(*arr) || *arr == '+' || *arr == '-' || *arr == ' ')//第一个字符的限制条件
			getbit(arr, &count1,&count2);//第一个字符是空格数字正负号才需要计算个数
		else return 0;
		int result = 0;//需要的整数值
		while (*arr == ' ' || isdigit(*arr) || *arr == '+'||*arr=='-'){
			if (isdigit(*arr))  {
				while (isdigit(*arr)){//同样找到数字开始进行计算数字的和
					result = result + ((*arr - '0')*(int)pow(10, (double)count1 - 1));
					count1--;//每次数字个数减一
					arr++;//指针移动(上面条件得到的是字符数字,需要减去字符0才是我们需要的结果)
				}
				break;//碰到非数字,循环结束,直接退出大循环
			}
			arr++;
			
		}if (count2 & 1) return -1*result;
		else 	
		return result;

}
int main() {
		char arr[] = "  -545";
			int result = atoi(arr);
		  printf("%d\n", result);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

atoi函数(c语言) 的相关文章

  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大
  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • Maven + Cobertura:无法找到[您的班级]。你指定了源目录吗?

    我有 MyMath 类 有两个简单的方法 multi 和 add 和测试类只会测试多种方法 public class MainTest Test public void testMultiply MyMath tester new MyMa
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 存储过程将多个表返回到 spring jdbc 模板

    我正在使用 JdbcTemplate 从 Spring DAO 类调用存储过程 我的问题是 存储过程返回多个表 有没有办法使用 Spring JdbcTemplate 访问多个表 如果我使用jdbcTemplate queryForList
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 2014传智播客C++第三期基础班+就业班至9月份 完整版

    课程简介 第一阶段C语言10天 此阶段兼顾基础班升级学员与直接报就业班学员 突出面试辅导为主 1 常量与变量 数据类型 数据类型转换 数据输入与输出 面试辅导 2 C语言运算符 C语言操作符 C语言表达式 表达式优先级 面试辅导 3 C语言
  • 图的深度优先遍历DFS (邻接矩阵实现) c语言

    图的遍历是指从图中的某一顶点出发 按照一定的策略访问图中的每一个顶点 每个顶点有且只能被访问一次 深度优先遍历也叫深度优先搜索 Depth First Search 它的遍历规则 先选择一个初始顶点 再规定一个方向 例如往右边一直遍历 于是
  • canvas基本用法

    首先创建canvas元素
  • 在Windows下编译扩展OpenCV 3.4.2 + opencv_contrib

    请参考 https www cnblogs com jliangqiu2016 p 5597501 html 这里主要说一下注意点 1 编译过程中会提示缺少以下文件 vgg generated 48 i vgg generated 64 i
  • 欧拉角的详解

    转自 https blog csdn net schrodinger1900 article details 52734568 关于旋转永远是做游戏的难点和混乱点 我们知道表示一个旋转有多种方式 简单的欧拉角 复杂点的四元数 再复杂点的矩阵
  • PS 2023 24.7 Beta Ai 如何解决橙色错误弹窗问题?

    距离Adobe软件公司首次将图像编辑及数字绘画软件Photoshop推出到大众面前已经过去35年 最近该公司又再次书写了属于Photoshop的历史新篇章 Adobe 发布的 Photoshop Beta 新增 创意填充 Generativ
  • Linux操作系统shell指令详解

    shell指令基本概念 命令行提示符 ubuntu 用户名 分隔符 ubuntu 主机名 家目录 当前所在的路径 普通用户权限 root 切换用户 su 用户名 gt 切换到指定用户 su gt 默认切换到超级用户 sudo 加在指令前 g
  • 【Hyperledger Fabric 开发学习1】 环境搭建

    1 概览 准备工作 1 系统环境准备 Ubuntu 20 02 LTC 2 apt 更换镜像源 3 辅助工具安装 4 安装go 5 安装容器docker和docker compose Hyperledger Fabric安装 方法1 以bo
  • Unity常见平台汇总

    UNITY EDITOR Unity编辑器 UNITY EDITOR WIN Windows 操作系统 UNITY EDITOR OSX macos操作系统 UNITY STANDALONE OSX 专门为macos 包括Universal
  • std::atomic和std::mutex区别

    std atomic介绍 模板类std atomic是C 11提供的原子操作类型 头文件 include
  • (附源码)node.js蒲公英旅游系统 毕业设计15565

    nodejs 蒲公英旅游系统 摘 要 随着社会的发展 社会的各行各业都在利用信息化时代的优势 计算机的优势和普及使得各种信息系统的开发成为必需 蒲公英旅游系统设计 主要的模块包括查看后台首页 轮播图 轮播图管理 公告管理 公告 资源管理 旅
  • 华为鸿蒙电脑操作系统测试版,华为鸿蒙OS测试

    软件介绍 华为鸿蒙OS测试平台是一款华为测试手机新系统的测试平台 这里可以让申请的用户最新体验华为的最新鸿蒙系统 让数百万用户去发现华为系统的不足 然后华为官方进行优化 我相信很多人都愿意做这个小白鼠 快来关注吧 华为鸿蒙OS测试软件简介
  • 【满分】【华为OD机试真题2023 JAVA&JS】Excel单元格数值统计

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 Excel单元格数值统计 知识点递归循环数组 时间限制 2s 空间限制 256MB 限定语言 不限 题目描述 Excel工作表中对选定区域的数值进行统计的功能非常实用 仿照Exc
  • 使用Simulink进行stm32开发2

    使用Simulink进行stm32开发2 小车直流电机控制 1 配置工程文件 simulink 模块搭建 stm32驱动模块 配置数据字典 配置电机控制函数 模块封装 加入输入并生成代码 基于对模型开发的学习 在这里用simulink搭建小
  • MyBatis 使用数组作为参数

  • OpenGL教程(五)

    前言 正如之前章节所提到的 着色器就是运行在GPU上的小程序 简单来说 着色器就是仅仅是一个将输入数据经过一定转换然后输出的过程 着色器之间是非常独立的 彼此之间除了输入输出之外没有其他交流 这篇文章将会详细介绍着色器以及编写着色器的语言G
  • 上下div之间有间距的问题

    我写了4个div 上下分布 均存在间距 代码以及效果如下 div1 height 100px background color blue position relative div2 height 100px background colo
  • HTTP请求方式中8种请求方法(简单介绍)

    HTTP请求方式中8种请求方法 简单介绍 简单介绍 HTTP是超文本传输协议 其定义了客户端与服务器端之间文本传输的规范 HTTP默认使用80端口 这个端口指的是服务端的端口 而客户端使用的端口是动态分配的 当我们没有指定端口访问时 浏览器
  • [Unity2D/3D]实用的血条制作(第一期)

    Unity2D 3D 实用的血条制作 第一期 在多数的游戏制作中 都会涉及到血条的制作 不论是在2D游戏中还是3D游戏中都非常常见 如何制作一款简易的血条呢 这里我给结合自己自学过程中用到的血条制作方法给大家分享一下我是如何制作血条的 效果
  • atoi函数(c语言)

    目录 atoi函数的说明 函数改编以及思路 代码 代码注释 atoi函数的说明 该函数的作用是将一字符串变为一整型类型的数字输出出来 若字符串内无数字则输出0 此处输出按十进制输出 字符串开头的空格会自动扫描为空 函数改编以及思路 对该函数