• 【C】atoi和offsetof的介绍和模拟实现


    在这里插入图片描述
    博客主页: XIN-XIANG荣
    系列专栏:【从0到1,C语言学习】
    一句短话:你若盛开,蝴蝶自来!
    博客说明:尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上的伙伴,文章中如果发现错误及不足之处,还望在评论区留言,我们一起交流进步!😊

    前言

    😽这里介绍atoi、offsetof以及它们的模拟实现,atoi这个库函数用来将一个字符串转化为一个数字;offsetof用来计算偏移量,长的像个函数,其实它是一个宏!

    一. atoi库函数

    1. 介绍

    功能:

    • 将一个数字字符串转化为其对应的整数
    int atoi (const char * str);
    
    • 1

    头文件:

    参数:

    • str——指向要进行转化的字符串的指针

    返回值:

    • 成功时,函数将转换后的整数作为int值返回;
    • 如果不能进行转换,返回0;
    • 如果转换后的值超出int的可表示值范围,则行为未定义

    注意事项:

    • atoi在使用时,如果要转化的字符串前面有空白字符,则会跳过这些空白字符,直到找到第一个非空白字符;
    • 要被转化的字符串中开头可以带 + - 号这样的字符,会被识别为算数当中的 + - 号;
    • 如果要转化的数字字符之间有非非数字字符,则非数字字符之后的数字字符无法被转化。

    使用实例:

    img

    2. 模拟实现

    atoi的模拟要尽可能模拟全面,要考虑到如下几点:

    1. 参数为空指针
    2. 参数为空字符串
    3. 字符串最开头空格
    4. 第一个数字字符前的 + - 号
    5. 转化后的值越界,超出int的范围
    6. 字符串中的非数字字符
    #include
    #include
    #include
    #include
    
    enum Status
    {
    	VALID,
    	INVALID
    }sta = INVALID;//默认非法
    
    int My_atoi(const char* str)
    {
    	int flag = 1;
    
    	assert(str);
    	if (*str == '\0')
    	{
    		return 0;//返回的非法0
    	}
    	//跳过空白字符
    	while (isspace(*str))
    	{
    		str++;
    	}
    	//解决+-号
    	if (*str == '+')
    	{
    		flag = 1;
    		str++;
    	}
    	else if (*str == '-')
    	{
    		flag = -1;
    		str++;
    	}
    	long long ret = 0;
    	while (*str)
    	{
    		if (isdigit(*str))
    		{
    			ret = ret * 10 + flag * (*str - '0');
    			//判断越界
    			if (ret > INT_MAX || ret < INT_MIN)
    			{
    				return 0;
    			}
    		}
    		else
    		{
    			return (int)ret; 
    		}
    		str++;
    	}
    	if (*str == '\0')
    	{
    		sta = VALID;
    	}
    	return (int)ret;
    }
    int main()
    {
    	char arr[50] = "-1234";
    	int ret = My_atoi(arr);
    	if (sta == INVALID)
    	{
    		printf("非法返回:%d\n", ret);
    	}
    	else if(sta == VALID)
    	{
    		printf("合法转换:%d\n", ret);
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    二. 宏offsetof

    1. 介绍

    功能:

    • 计算结构成员相对于结构体首地址的偏移量
    offsetof (type,member)
    
    • 1

    参数:

    • type——结构或者联合类型
    • member——类型中的成员

    返回值:

    • 返回成员相对于类型首地址的偏移量,一个size_t类型的值。

    使用实例:

    img

    2. 模拟实现

    去观察结构体的地址和结构成员的地址会发现,结构体成员的地址减去结构体的地址就是结构体成员相对于结构体首地址的偏移量;

    假设0地址处为结构体的地址,那么结构体成员的地址就是其的相对于结构体首地址的偏移量

    #include
    #define OFFSETOF(type, name) (int)&(((struct S*)0)->name)
    
    struct S
    {
    	int a;
    	char b;
    	double c;
    };
    
    int main()
    {
    	printf("%d\n", OFFSETOF(struct S, a));
    	printf("%d\n", OFFSETOF(struct S, b));
    	printf("%d\n", OFFSETOF(struct S, c));
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结语

    各位小伙伴,看到这里就是缘分嘛,希望我的这些内容可以给你带来那么一丝丝帮助,可以的话三连支持一下呗😁!!! 感谢每一位走到这里的小伙伴,我们可以一起学习交流,一起进步😉!!!加油🏃!!!

    img

  • 相关阅读:
    时间序列预测—双向LSTM(Bi-LSTM)
    直播 | 数据仓库?数据湖?停止纠结,流批融合的极速 Lakehouse来了!
    2022年10月21日数据库实验内容
    速腾激光雷达 RS M1 slam 建图
    基于衰减因子和动态学习的改进樽海鞘群算法-附代码
    [笔记]攻防工具分享之 CobaltStrike框架 《一》环境配置
    【C++语法讲解】 | 运算符重构 | 三种运算符的重构方式 |代码演示
    Pika v3.5.1发布!
    基于增强形态学滤波的旋转机械故障诊断方法(MATLAB)
    AVLTree模拟实现
  • 原文地址:https://blog.csdn.net/Trong_/article/details/126004630