atio函数和宏offset的介绍

news2024/12/25 13:17:17

目录

  • 前言
  • atoi函数
  • 宏offsetof
  • 总结

前言

本章带大家一起认识一些在我们C语言标准库中的函数

atoi函数

int atio(const char* str);

头文件:

#include<stdlib.h>

参数:
str指向常量字符串起始位置的指针
函数介绍:

①解析C语言字符串str,将其内容解释为整数,返回一个int类型的值。
②函数丢弃空白字符,直到第一个非空白字符被找到,从该元素开始取一个可选的初始加号或减号,后面跟着以10基数的数字,并将它们解释为数值。(注意:初始加号或者减号后面跟着的必须是字符数字,只出现一次,其他情况下出现为非字符数字)
③如果字符串str中的第一个非空字符不是有效的整数,或者字符串str为空或字符串仅包含空白字符序列,则不执行转换,返回值为0。
④字符串中包含了非字符数字的字符,则非字符数字之前的字符数字(有效字符)直接被返回,后面的该非字符数字及其之后有效字符数字都不能被转换。
⑤如果函数转换成功,函数将转换之后的in类型的整数返回。如果转换后的值超过了int类型整数的取值范围,会导致未定义行为。

函数的使用案例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i = atoi("");//字符串什么都没有
	int a = atoi("   ");//字符串都为空字符
	int b = atoi("a123");//第一个字符非数字字符
	int c = atoi("000123#456");//字符串中间为非数字字符
	int d = atoi("99999999999999999999999");
	//有效字符的值超过int类型的取值范围
	int e = atoi("    +-123456");//加减号同时出现
	int m = atoi("  +123456");//只有减号出现
	int n = atoi("  -123456");//只有加号出现
	printf("%d\n", i);
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
	printf("%d\n", d);
	printf("%d\n", e);
	printf("%d\n", m);
	printf("%d\n", n);
	return 0;
}

代码运行的结果为:
在这里插入图片描述
atoi函数的模拟实现:

//需要考虑的情况
//空白字符
//+/-号
//溢出
//""空字符串
//空指针
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
enum State
{
	INVALID,
	VALID
}state= INVALID;//默认表示非法
int my_atoi(const char* str)
{
	assert(str);
	if (*str == '\0')
	{
		return 0;
	}
	//isspace判断是否为空白字符
	//是空白字符为真,否则为假
	//跳过空白字符
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;//判断初始正负号
	if (*str == '+')
	{
		str++;
	}
	else if(*str=='-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;//存放返回值
	while (*str)
	{
	//isdigit判断是否为字符数字
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			if (ret > INT_MAX)
			{
				return INT_MAX;
			}
			else if (ret < INT_MIN)
			{
				return INT_MIN;
			}
		}
		else
		{
			return (int)ret;
		}
		str++;
	}
	state = VALID;
	return (int)ret;
}
int main()
{
	int ret=my_atoi("123456");
	if (state == VALID)
	{
		printf("%d\n", ret);
	}
	else
	{
		printf("非法字符串转换:%d\n",ret);
	}
	return 0;
}

代码运行的结果:
在这里插入图片描述

宏offsetof

在这里插入图片描述
宏使用形式:

offsetof(type, member)

头文件:

#include<stddef.h>

参数介绍:

type
为有效成员指示符的类型,一般为结构体或者联合体类型
member
为type类型的成员

宏的介绍:

该函数形式的宏返回的是结构体成员或联合体成员的偏移值(成员距离0偏移量的位置),单位为字节。

宏offsetof的使用例子:

#include<stddef.h>
#include<stdio.h>
struct S
{
	char c1;
	int i;
	char c2;
};
int main()
{
	printf("%d\n", offsetof(struct S,c1));
	printf("%d\n", offsetof(struct S, i));
	printf("%d\n", offsetof(struct S, c2));
	return 0;
}

代码运行的结果:
在这里插入图片描述
宏offsetof的模拟实现:

//宏的模拟实现
#include<stdio.h>
struct S
{
	char c1;//1/8 对齐数为1
	int i;//4/8 对齐数为4
	char c2;//1/8 对齐数为1
};
#define my_offsetof(type,member)  (int)&(((type*)0)->member)
int main()
{
	printf("%d\n",my_offsetof(struct S,c1));
	printf("%d\n", my_offsetof(struct S, i));
	printf("%d\n", my_offsetof(struct S, c2));
	return 0;
}

代码运行的结果:
在这里插入图片描述

图形理解:
在这里插入图片描述
解释:

通过图形观察我们可以发现,结构体成员的起始地址和0偏移量地址相减的个数(地址之间的字节数)刚好就是该结构体成员的偏移量。既然这样,我们把0偏移量地址设为0,那么结构体成员变量的起始地址刚好也表示偏移量;我们在定义宏my_offsetof的时候,把整型变量0强转为结构体类型的指针变量,指向结构体里面的成员,然后取成员变量的地址随即强转为整型,得到便是该成员的偏移量。

总结

本章为大家介绍了函数atoi和宏offsetof的使用,希望对大家认识函数atoi和宏offsetof有些许帮助!最后感谢大家阅读,若有不对,欢迎指正!

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

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

相关文章

2023软件测试工程师必备技能?要卷,谁还不会了......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试岗位是怎…

FPGA基于Tri Mode Ethernet MAC实现UDP通信 提供3套工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、米联客UDP协议栈4、详细设计方案5、Tri Mode Ethernet MAC的使用6、vivado工程1详解7、vivado工程2详解8、vivado工程3详解9、上板调试验证并演示10、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现udp基本生态如下&#x…

Spring Security实战(五)—— 密码加密

一、密码加密的演进 MD5 (Message-Digest Algorithm 5) 和 SHA (Secure Hash Algorithm) 是两种常见的消息摘要算法&#xff0c;它们都被用于加密和数据完整性验证等领域。 MD5 是一种 128 位的哈希函数&#xff0c;常用于数据完整性校验和数字签名等方面。它将任意长度的信息…

WebServer项目(四)->(基于Proactor的c++)Web服务器简介及简单实现

基于Proactor的cWeb服务器项目 WebServer项目(四)-&#xff1e;(基于Proactor的c)Web服务器简介及简单实现1.Web Server&#xff08;网页服务器&#xff09;2.HTTP协议(应用层的协议)3.HTTP 请求报文格式4.HTTP响应报文格式5.HTTP请求方法6.HTTP状态码7.服务器编程基本框架8.两…

分布式搜索技术elasticsearch概念篇

文章目录 一、分布式搜索技术二、elasticsearch2.1 初识elasticsearch2.2 正向索引和倒排索引2.2.1 介绍2.2.2 优缺点 2.3 elasticsearch和mysql的对比 一、分布式搜索技术 分布式搜索技术是一种基于分布式计算的搜索引擎技术&#xff0c;它使用多台计算机协同工作来处理大规模…

ElementUI登陆表单中常用的标签属性

ElementUI官网 为登陆框添加一个边角弧度 <style> .className{/*设置div边边框角的弧度*/border-radius: 10px; } </style><el–input>标签常用属性 <!--使用prefix属性添加一个前缀图标--> <el-input prefix-icon"el-icon-user-solid"&g…

深度学习第J6周:ResNeXt-50实战解析

目录 一、模型结构介绍 二、前期准备 三、模型 三、训练运行 3.1训练 3.2指定图片进行预测 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] &#x1f4cc; …

大数据技术之集群数据迁移

在大数据集群数据迁移的项目中涉及到很多技术细节&#xff0c;本博客记录了迁移的大致的操作步骤。 迁移借用Hadoop自带的插件&#xff1a;distcp。 一、Hadoop集群数据迁移 **DistCp&#xff08;分布式拷贝&#xff09;**是用于大规模集群内部和集群之间拷贝的工具。它使用M…

Meson构建系统的使用

一、前言 Meson 是用于自动化构建的自由软件&#xff0c;使用Python语言编写&#xff0c;在 Apache 许可证 2.0版本下发布&#xff0c;主要目标是为了让开发者节约用于配置构建系统的时间。 特点如下&#xff1a; 多平台支持&#xff0c;包括 GNU/Linux、Windows、MacOS、GCC、…

A_A01_008 STM32F103系列标准库移植经验分享

A_A01_008 STM32F103系列标准库移植经验分享 一、所需材料二、移植步骤三、注意事项四、参考资料与友情链接 一、所需材料 1.MDK开发环境 此处版本V5.15 2.相关启动文件 此处用野火点灯例程 因为启动文件完整 方便更换 其它工程没有的可以直接复制这些启动文件过去 3.相关开…

Java版工程管理系统源代码-软件自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

8年测开年薪30W,为什么从开发转型为测试?谈谈这些年的心路历程……

谈谈我的以前&#xff0c;从毕业以来从事过两个多月的Oracle开发后转型为软件测试&#xff0c;到现在已近过去8年成长为一个测试开发工程师&#xff0c;总结一下之间的心路历程&#xff0c;希望能给徘徊在开发和测试之前的同学一点小小参考。 一、测试之路伏笔 上学偷懒&#…

EGO-Link FPGA智慧教育社区介绍:用 leetcode 的方式练习 verilog 语言

文章目录 介绍FPGA 语法例1&#xff1a;P1203 1输入1输出例2&#xff1a;P1204 3输入4输出例3&#xff1a;P1207 P1208 P1205 与或非门例4&#xff1a;P1200 半加器例5&#xff1a;P1201 4位二进制转余3循环码例6&#xff1a;P1215 2选1多路选择器例7&#xff1a;P1236 D触发器…

【C语言】浅涉结构体(声明、定义、类型、定义及初始化、成员访问及传参)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 结构体的声明 1.1 结构体的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. 结构体成员的访问 3. 结构体传参 1. 结构体的声明 1.1 结构体的基础知识 结构是一些值的集合&…

探索Apache Hudi核心概念 (4) - Clustering

Clustering是Hudi在0.7.0版本引入的一项特性&#xff0c;用于优化文件布局&#xff0c;提升读写性能&#xff0c;现在它已经成为Hudi的一项重要性能优化手段。本文我们会通过Notebook介绍并演示Clustering的运行机制&#xff0c;帮助您理解其工作原理和相关配置。 1. 运行 Not…

RocketMQ 多级存储设计与实现

作者&#xff1a;张森泽 随着 RocketMQ 5.1.0 的正式发布&#xff0c;多级存储作为 RocketMQ 一个新的独立模块到达了 Technical Preview 里程碑&#xff1a;允许用户将消息从本地磁盘卸载到其他更便宜的存储介质&#xff0c;可以用较低的成本延长消息保留时间。本文详细介绍 …

记录贴:EasyPoi word导出问题一览

项目场景&#xff1a; EasyPoi word导出 问题描述1 easypoi 模板导出 我直接在map的value输入空格或"",出来的是{{,两个左花括号,咋解决 解决方案&#xff1a; exportMap.put("key", "\u00A0"); //空格前端效果&#xff1a; 其他无效解决方案…

Redis安装配置操作记录

Redis 官网&#xff1a;https://redis.io/ 中文文档&#xff1a;https://www.redis.com.cn/documentation.html 在线命令参考&#xff1a;http://doc.redisfans.com 一&#xff0c;Redis下载安装与配置 下载网站&#xff0c;可下载安装包然后安装或可使用brew来安装Redis&#…

LeetCode——前K个高频单词

692. 前K个高频单词 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序。 示例 1&#xff1a; 输入: words [“i”, “love”, “le…

太阳能电池测试解决方案NS-9001

前言 太阳能行业的快速发展提高了对太阳能电池测试和精确测量解决方案要求&#xff0c;伴随着太阳能电池尺寸大小质量的提升&#xff0c;充电电池测试必须更多的电流和更高输出功率水准&#xff0c;这就更加需要灵活多变的测试方案支持。 现阶段&#xff0c;太阳能电池测试 解…