C语言 内存函数 自定义类型 结构体 枚举 联合

news2024/9/27 15:17:44

perror

在这里插入图片描述

#include <stdio.h>
#include <errno.h>
#include <string.h>

//strerror
//perror与上相关  更加方便直接打印错误信息   上边需要先将错误码转换为错误信息  再用printf打印
//
int main()
{
	//打开文件失败的时候,会返回NULL
	FILE* pf = fopen("test.txt", "r");
	//0   "no error"
	if (pf == NULL)
	{
		//printf("%s\n", strerror(errno));   strerror他会把错误码所对应的错误信息的首字符地址返回来。%s打印可以打印出一个字符串
		perror("fopen");//这个括号里是自定义信息  想加什么加什么  会在错误信息前显示
		return 1;
	}
	//读文件
	// 
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

字符分类函数

在这里插入图片描述

int main()
{
	char ch = 'a';
	//isdigit  如果是数字字符返回非0的值,如果不是数字字符,返回0

	if (ch >= 'A' && ch <= 'Z')
	{

	}

	//int ret = isdigit(ch);
	//int ret = islower(ch);
	//printf("%d\n", ret);

	return 0;
}

是想要的就返回非0 不是想要的就返回0

tolower转小写 toupper转大写

int main()
{
	char arr[20] = { 0 };
	scanf("%s", arr);
	int i = 0;
	while (arr[i] != '\0')
	{
		if (isupper(arr[i]))
		{
			arr[i] = tolower(arr[i]);//转化为小写在放到原位置
		}
		printf("%c ", arr[i]);
		i++;
	}

	return 0;
}

内存函数

*void memcpy( void dest, const void src, size_t count );
size表示要拷贝多大空间 单位是字节
** memcpy 内存块拷贝函数

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//01 00 00 00 02 00 00 00 ...
	int arr2[20] = { 0 };
	//strcpy()
	//char* strcpy(char* dest, const char* src)
	return 0;
}

如上代码 我们之前所学的字符串拷贝函数肯定是不行的

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };


	memcpy(arr2, arr1, 20); //把arr1前5个内容拷贝到arr1 因为拷贝单位是字节  一个整型4个字节
	return 0;
}

my_memcpy

#include <assert.h>

void* my_memcpy(void* dest, const void*src, size_t num)
{
	void* ret = dest;
	assert(dest && src);

	
	
		while (num--)//总共要拷贝的字节数  循环四次  每次搞定四个字节
		{
			*(char*)dest = *(char*)src;//强制类型转换意思是void不能直接解引用
			dest = (char*)dest + 1;//拷贝完一次后往后走
			src = (char*)src + 1;
		}

	return ret;
}


int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };

	my_memcpy(arr2, arr1, 20);

	return 0;
}

int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; 接下来想把12345 放到34567这块空间 源头从1 目的地3开始

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//               1 2 1 2 3 4 5 8 9 10   应该出现的样子
	//my_memmove(arr1+2, arr1, 20);
	//memmove(arr1, arr1+2, 20);
	memmove(arr1+2, arr1, 20);   //加0指向1 加1指向2加2指向3

	//memcpy函数应该拷贝不重叠的内存
//memmove函数可以处理内存重叠的情况

	return 0;
}

模拟实现 my_memove

void* my_memmove(void* dest, const void*src, size_t num)
{
	void* ret = dest;
	assert(dest && src);

	if (dest < src)
	{
		//前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else 
	{
		//后->前
		while (num--)
		{
			//20先进来  减减效果产生来到这已经变成19
			*((char*)dest + num) = *((char*)src + num);//从后向前 必须要源头和目标的都是从后开始
		}
	}
	return ret;
}



//可以把元数据 从前向后拷贝 也可以从后向前拷贝
//从低地址往高地址拷贝时, 先拷贝高地址, 再拷贝低地址
//从高地址往低地址拷贝时, 先拷贝低地址, 再拷贝高地址
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//               1 2 1 2 3 4 5 8 9 10   应该出现的样子
	//my_memmove(arr1+2, arr1, 20);
	//memmove(arr1, arr1+2, 20);
	my_memmove(arr1+2, arr1, 20);   //加0指向1 加1指向2加2指向3

	//memcpy函数应该拷贝不重叠的内存
//memmove函数可以处理内存重叠的情况

	return 0;
}

在这里插入图片描述

memcmp (内存比较)

int main()
{
	float arr1[] = { 1.0, 2.0,3.0,4.0 };
	float arr2[] = { 1.0, 3.0 };
	int ret = memcmp(arr1, arr2, 8);    //-1   相同返回值0  如果第一个字符串大于第二个返回1  如果第一个小于第二个返回(小于0的)-1
	//memcmp - strcmp
	printf("%d\n", ret);

	return 0;
}

在这里插入图片描述

memset

在这里插入图片描述
把ptr所指向的那块空间的前num个字节的内容设置成我指定的value值

int main()
{
	//40
	int arr[10] = { 0 };//20
	memset(arr, 1, 20);//以字节为单位设置内存的
	//01 00 00 00    这是1
	//01 01 01 01    这肯定不是
	return 0;
}

自定义类型

结构体声明(结构体是定义一个复杂对象)

struct Book  //关键字和标签名
{
	char name[20];   //描述所需要的属性
	int price;
	char id[12];
}b4,b5,b6;//b4,b5,b6是全局的    

上面类型如何使用   类型是用来创建变量


int main()
{
	//b1,b2,b3是局部变量
	struct Book b1;
	struct Book b2;
	struct Book b3;
    类似于  int  b1

	return 0;
}

在这里插入图片描述
圈起来的作用相同 但是作用域不同 局部和全局

特殊声明

匿名结构体类型    用这个类型创建了个变量叫s   这个类型创建好后只能用一次  后面就不能再创建
struct
{
	char c;
	int i;
	char ch;
	double d;
} s;
struct
{
	char c;
	int i;
	char ch;
	double d;
} s;

struct
{
	char c;
	int i;
	char ch;
	double d;
}* ps;

int main()
{
	ps = &s;
	
	return 0;
}

编译器认为这是错的

结构体自引用

结构体可以包含结构体

struct A
{
	int i;
	char c;
};

struct B
{
	char c;
	struct A sa;
	double d;
};

但是结构体里不能包含自己

//struct N
//{
//	int d;//4
//	struct N n;
//}
//int main()
//{
//	struct N sn;//
//
//	return 0;
//}

什么叫结构体自引用如下
在这里插入图片描述

struct Node  //我自己能找到跟自己同类型的下一个元素
{
	int data;
	struct Node* next;
};

结构体变量的定义和初始化

struct S
{
	char c;
	int i;
}s1, s2;

struct B
{
	double d;
	struct S s;
	char c;
};
int main()
{
	//struct S s3 = {'x', 20};
	struct B sb = { 3.14, {'w', 100},'q' };
	//.   变量
	//->  指针
	printf("%lf %c %d %c\n", sb.d, sb.s.c, sb.s.i, sb.c);

	return 0;
}

结构体内存对齐

结构体占多大内存空间

struct S
{
	int i;//4
	char c;//1
};

struct S2
{
	char c1;//1
	int i;//4
	char c2;//1
};

//结构体内存对齐

int main()
{
	struct S s = {0};
	printf("%d\n", sizeof(s));//8

	struct S2 s2 = { 0 };
	printf("%d\n", sizeof(s2));//12

	return 0;
}

下篇讲解

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

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

相关文章

同为(TOWE)IPS系列工业插头插座、连接器的选型及特点

所谓工业插头插座、连接器&#xff0c;即欧洲标准插头插座&#xff0c;主要用于实现电信号的传输和控制以及电子与电气设备之间的电源连接。它可以通过连接器插头与插座之间的插合和分离&#xff0c;使电路产生接通和断开&#xff0c;适用于对安全、寿命和性能具有高要求的应用…

5款OCR文字识别软件推荐_分享好用的OCR(图片转文字)工具

5款OCR文字识别软件推荐 不知道大家是不是不知道OCR单词识别这个词。 小编认为&#xff0c;经常处理各种办公文件的朋友&#xff0c;对OCR文字识别这个词肯定有一定的了解&#xff0c;因为在处理办公文件的时候&#xff0c;很有可能会遇到对OCR文字识别的需求。 而当我们遇到O…

ubuntu16.04运行YOLOV5并部署

运行环境 环境&#xff1a;ubuntu 16.04 CUDA: 10.2 执行模型推理 1. 下载yoloV5 repo git clone https://github.com/ultralytics/yolov52. 用conda新建python环境 conda create -n yolo python3.83. 安装需求包 pip install -r requirements.txt 4. (requremets中包含…

@Configuration如何保证@Bean单例语义?

1. 前言 Spring允许通过Bean注解方法来向容器中注册Bean&#xff0c;如下所示&#xff1a; Bean public Object bean() {return new Object(); }默认情况下&#xff0c;bean应该是单例的&#xff0c;但是如果我们手动去调用Bean方法&#xff0c;bean会被实例化多次&#xff0…

iServer使用影像服务(二)——影像服务发布为wmts和wms服务的加载

前言 自从SuperMap iServer10.2.0版本开始新增影像服务模块&#xff0c;并支持大规模影像&#xff08;栅格&#xff09;数据快速发布为影像服务&#xff0c;之后推出的版本中都陆陆续续对影像服务模块扩充了新功能、增强了新特性&#xff1b;如在SuperMap iServer10.2.1版本中…

JAVA注解使用

JAVA注解使用简介概念说明自定义注解注解格式元注解注解本质属性注解生成文档案例生成的源代码生成Doc简单的自定义反射演示注解定义调用类定义测试通过注解实现配置类定义枚举类定义注解配置类使用注解测试自动生成数据库生成演示数据库注解定义使用注解创建数据表使用注解创建…

[Java安全]—fastjson漏洞利用

前言 文章会参考很多其他文章的内容&#xff0c;记个笔记。 FASTJSON fastjson 组件是 阿里巴巴开发的序列化与 反序列化组件。 fastjson 组件 在反序列化不可信数据时会导致远程代码执行。 POJO POJO是 Plain OrdinaryJava Object 的缩写 &#xff0c;但是它通指没有使用 …

ZGC 垃圾收集器详解(过程演示)

理论部分就不细讲了&#xff0c;具体可以看《 jvm 虚拟机原理》&#xff0c;下面直接画图来演示 ZGC 垃圾回收过程。 第一步 初始状态&#xff0c;视图由 mark0 切换为 Remapped &#xff0c;其中&#xff0c;大方块是 region&#xff0c;小方块是对象&#xff0c;小方块上面数…

Win11的几个实用技巧系列之不能玩植物大战僵尸、如何彻底删除360所有文件

目录 Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解决方法 Win11玩不了植物大战僵尸的解决方法 win11如何彻底删除360所有文件?win11彻底删除360所有文件方法分享 win11如何卸载360&#xff1a; Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解…

记一次H3CIE实验考试

一、前言 直接上图 IE机试在12月19号考的&#xff0c;为避免成为小羊人&#xff0c;没去北京/杭州这2个固定地点&#xff0c;就在本省的协办单位考的。但是&#xff0c;还是中招了&#xff0c;5个同学一起去考的&#xff0c;全阳了。 华三机试一共有三套图&#xff0c;ACD&am…

1343:【例4-2】牛的旅行

1343&#xff1a;【例4-2】牛的旅行 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 农民John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言&#xff0c;你能看到至少有两个牧区不连通。现在&#xff0c;John…

【特殊的一年,过去了】再见2022,你好2023

现在是2022年12月30日&#xff0c;提前的新年快乐&#xff01; 各位阳过了吗&#xff1f;&#xff08; tips:最近新学会的打招呼方式:) &#xff09; 我已经阳康啦&#xff0c;所以本文是带有奥密克戎抗体的&#xff0c;各位不用担心~ – 2022可算是快接近尾声啦&#xff01;…

虹科案例|Vuzix辅助和增强现实技术的全球领导者

当今企业的新现实 Vuzix 大多数科技业内人士都认为&#xff0c;未来将是免提时代。总有一天&#xff0c;智能手机、平板电脑、台式电脑和笔记本电脑将被更直观的设备所取代。 然而&#xff0c;对于未来免提的条件&#xff0c;各方意见并不一致。未来的免提设备是将数字信息覆盖…

IntelliJ IDEA 详细使用教程 – 主题,字体,类和方法注释设置

IDEA是Java开发者最喜爱的开发工具之一&#xff0c;高端大气&#xff0c;智能化&#xff0c;个性化&#xff0c;每个开发者都喜欢设置自己喜欢的主题&#xff0c;字体&#xff0c;打造一个属于自己的IDE&#xff0c;本次介绍在IDEA中&#xff0c;如何设置主题&#xff0c;字体等…

聊聊AQS

Java中 AQS 是 AbstractQueuedSynchronizer 类&#xff0c;AQS 依赖 FIFO 队列来提供一个框架&#xff0c;这个框架用于实现锁以及锁相关的同步器&#xff0c;比如信号量、事件等。 在 AQS 中&#xff0c;主要有两部分功能&#xff0c;一部分是操作 state 变量&#xff0c;第二…

调用html5播放器时,出现播放器按钮太小的问题

用手机浏览器打开视频&#xff0c;有时会出现播放器按钮太小的情况&#xff0c;此时只需在<head>中加入下面这段viewport代码即可解决&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1,minimum-scale1…

Docker下Mysql应用部署

目录 环境搭建 进入mysql 外部连接mysql 外部插入数据 查询容器数据 环境搭建 docker pull mysqlmkdir /root/mysql cd /root/mysqldocker run -id \ -p 3307:3306 \ --name my_sql \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -v $PWD/conf:/etc/mysql/conf…

【开源项目】任务调度框架PowerJob介绍及源码解析

项目介绍 PowerJob&#xff08;原OhMyScheduler&#xff09;是全新一代分布式调度与计算框架&#xff0c;能让您轻松完成作业的调度与繁杂任务的分布式计算。 项目地址 源码&#xff1a;https://gitee.com/KFCFans/PowerJob官网&#xff1a;http://www.powerjob.tech/index…

前端期末考试试题及参考答案(01)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 ______表示页面中一个内容区块或整个页面的标题。______表示页面中一块与上下文不相关的独立内容&#xff0c;比如一篇文章。CSS的引入方式有3种&#xff0c;分…