当前位置:网站首页>【C】atoi和offsetof的介绍和模拟实现
【C】atoi和offsetof的介绍和模拟实现
2022-07-28 22:06:00 【XIN-XIANG荣】
博客主页: XIN-XIANG荣
系列专栏:【从0到1,C语言学习】
一句短话:你若盛开,蝴蝶自来!
博客说明:尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上的伙伴,文章中如果发现错误及不足之处,还望在评论区留言,我们一起交流进步!
前言
这里介绍atoi、offsetof以及它们的模拟实现,atoi这个库函数用来将一个字符串转化为一个数字;offsetof用来计算偏移量,长的像个函数,其实它是一个宏!
一. atoi库函数
1. 介绍
功能:
- 将一个数字字符串转化为其对应的整数
int atoi (const char * str);
头文件:
- <stdlib.h>
参数:
- str——指向要进行转化的字符串的指针
返回值:
- 成功时,函数将转换后的整数作为int值返回;
- 如果不能进行转换,返回0;
- 如果转换后的值超出int的可表示值范围,则行为未定义。
注意事项:
- atoi在使用时,如果要转化的字符串前面有空白字符,则会跳过这些空白字符,直到找到第一个非空白字符;
- 要被转化的字符串中开头可以带 + - 号这样的字符,会被识别为算数当中的 + - 号;
- 如果要转化的数字字符之间有非非数字字符,则非数字字符之后的数字字符无法被转化。
使用实例:

2. 模拟实现
atoi的模拟要尽可能模拟全面,要考虑到如下几点:
- 参数为空指针
- 参数为空字符串
- 字符串最开头空格
- 第一个数字字符前的 + - 号
- 转化后的值越界,超出int的范围
- 字符串中的非数字字符
#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<ctype.h>
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;
}
二. 宏offsetof
1. 介绍
功能:
- 计算结构成员相对于结构体首地址的偏移量
offsetof (type,member)
参数:
- type——结构或者联合类型
- member——类型中的成员
返回值:
- 返回成员相对于类型首地址的偏移量,一个size_t类型的值。
使用实例:

2. 模拟实现
去观察结构体的地址和结构成员的地址会发现,结构体成员的地址减去结构体的地址就是结构体成员相对于结构体首地址的偏移量;
假设0地址处为结构体的地址,那么结构体成员的地址就是其的相对于结构体首地址的偏移量
#include<stdio.h>
#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;
}
各位小伙伴,看到这里就是缘分嘛,希望我的这些内容可以给你带来那么一丝丝帮助,可以的话三连支持一下呗!!! 感谢每一位走到这里的小伙伴,我们可以一起学习交流,一起进步!!!加油!!!

边栏推荐
猜你喜欢

使用Pytorch快速训练网络模型

Jincang database kingbasees client programming interface guide ODBC (2. Overview)

Explanation of history and chemical properties of Worthington ribonuclease B

YOLOV5学习笔记(一)——原理概述

【详细超简单】如何使用WebSocket链接

GhostNets on Heterogeneous Devices via Cheap Operations

SAP 临时表空间错误处理

E-commerce data model design

剑指 Offer 55 - I. 二叉树的深度

Exchange 2013 SSL证书安装文档
随机推荐
添加构建依赖项报错
Apple's official website is being updated to maintain the apple store. Products such as the iPhone 13 / pro of the Bank of China will enjoy a maximum discount of 600 yuan
[data mining engineer - written examination] Dahua shares in 2022
Uricase - Characteristics of uricase in Worthington pig liver:
酪氨酸脱羧酶丨Worthington粪链球菌酪氨酸脱羧酶的特征
Deep analysis of integrated learning AdaBoost
Deep analysis of integrated learning gbdt
[self] - brush questions logic
使用Pytorch快速训练网络模型
多传感器融合定位(一)——3D激光里程计
Is the declarative code of compose so concise?
类中多函数填写,LeetCode919——完全二叉树插入器
Zabbix 5.0 使用自带Redis模版监控
零视科技 H5S视频平台 GetUserInfo 信息泄漏漏洞 CNVD-2020-67113
Multi sensor fusion positioning (II) -- map based positioning
超参数优化(网格搜索和贝叶斯优化)
Design idea of room inventory in hotel reservation system database
智能垃圾桶(七)——SG90舵机的介绍与使用(树莓派pico实现)
浪潮ClusterEngineV4.0 远程命令执行漏洞 CVE-2020-21224
有效供应链管理的八大绩效分析指标(上)
