常见字符串函数+qsort的模拟实现+结构体对齐+位段+枚举优点

掌握字符串函数与结构体对齐:内存管理、位段与跨平台挑战


说明主要用于自我复习 不足之处还请见谅

常见字符串函数

1,strlen

size_t strlen ( const char * str );
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的( 易错 )

2, strcpy

char* strcpy(char * destination, const char * source );
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变

3,strcat

将原来的字符串添加到目标字符串后面并且新的字符串以\0结尾
源字符串必须有’\0’;

4,strcmp

比较字符串主要就是根据字典序进行排序

5,strstr

char * strstr ( const char *str1, const char * str2);
返回str2在str1中出现的第一个地址,如果str1中不存在str2那么便返回NULL

memcpy与memmove

void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理
例如假设有一个数组a,如果是memcpy(a,a+3)的话那么这个操作是未被定义的,具体的复制方式以及复制能否成功主要还是看编译器是否支持。但是如果使用memmove确实可以直接使用的
memcpy模拟实现
由于不知道复制的类型,所以我们模拟的时候都是先将指针强制转换成char*然后再解引用

void* my_memcpy(const void* e1, const void* e2,size_t num)
{
   
   

	assert(e1 && e2);
	void* ret = e1;
	while (num--)
	{
   
   
		*(char*)e1 = *(char*)e2;
		e1 = (char*)e1+1;
		e2 = (char*)e2+1;
	}
	return ret;
}

memmove函数的模拟实现

void* my_memmove(const void* e1, const void* e2,size_t num)
{
   
   
	assert(e1 && e2);
	void* ret = e1;//待会要返回的就是ret;
	if (e1 > e2)//如果e1>e2那么就是从e2从后开始往前拷贝
		      //因为这样才不会覆盖
		//否则从前开始拷贝
	{
   
   
		e1 = (char*)e1 + num - 1;
		e2 = (char*)e2 + num - 1;
		while 
<think>我们参考了上述引用中关于qsort函数结构体数组排序的信息。用户明确询问使用C语言qsort函数实现结构体排序的方法。 根据引用[2][3][4],我们可以总结出以下步骤: 1. 包含必要的头文件:<stdlib.h>(qsort函数)和<string.h>(如果涉及字符串比较)。 2. 定义结构体类型。 3. 编写比较函数(comparator function),该函数必须符合qsort要求的签名:int (*)(const void *, const void *) 在比较函数内部,将void指针转换为结构体指针,然后根据需要比较的成员(例如年龄或姓名)进行比较。 4. 调用qsort函数,传入参数:数组名、数组长度、每个元素的大小、比较函数。 注意:qsort默认是升序排列。比较函数返回正数表示第一个参数大于第二个参数(需要交换),负数表示小于(不交换),0表示相等。 引用[4]提供了完整的代码示例,包括按年龄排序和按姓名排序。 因此,我们可以按照以下结构回答: 1. 包含头文件 2. 定义结构体 3. 编写比较函数示例(按年龄、按姓名) 4. 调用qsort 同时,我们将生成相关问题。 </think>### C语言使用qsort函数实现结构体排序的方法 在C语言中,使用标准库函数`qsort()`对结构体数组排序需要以下步骤: #### 1. 包含头文件 ```c #include <stdlib.h> // qsort函数 #include <string.h> // 字符串比较函数strcmp(如需要) ``` #### 2. 定义结构体类型 ```c typedef struct { char name[20]; int age; float score; } Student; // 示例结构体 ``` #### 3. 编写比较函数 比较函数必须符合签名:`int (*)(const void *, const void *)` **示例1:按整数字段排序(如年龄)** ```c int compare_age(const void *a, const void *b) { // 转换为结构体指针后比较 return ((Student*)a)->age - ((Student*)b)->age; } ``` **示例2:按字符串字段排序(如姓名)** ```c int compare_name(const void *a, const void *b) { // 使用strcmp比较字符串 return strcmp(((Student*)a)->name, ((Student*)b)->name); } ``` **示例3:按浮点数字段排序(如分数)** ```c int compare_score(const void *a, const void *b) { float diff = ((Student*)a)->score - ((Student*)b)->score; return (diff > 0) ? 1 : (diff < 0) ? -1 : 0; // 处理浮点精度 } ``` #### 4. 调用qsort函数 ```c Student arr[50]; // 结构体数组 size_t count = 50; // 元素数量 // 按年龄升序排序 qsort(arr, count, sizeof(Student), compare_age); // 按姓名升序排序 qsort(arr, count, sizeof(Student), compare_name); ``` #### 📌 关键说明 1. **参数顺序**: ```c qsort(数组指针, 元素数量, 元素大小, 比较函数); ``` 2. **比较函数规则**: - 返回`>0`:`a`排在`b`后 - 返回`<0`:`a`排在`b`前 - 返回`0`:两者相等 3. **注意事项**: - 字符串比较必须用`strcmp()`而非`==` - 浮点数比较需处理精度问题 - 避免在比较函数中修改数据[^2][^4] #### 🌰 完整示例 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[20]; int age; } Person; int compare_age(const void *a, const void *b) { return ((Person*)a)->age - ((Person*)b)->age; } int main() { Person people[] = {{"Alice", 25}, {"Bob", 20}, {"Charlie", 22}}; size_t n = sizeof(people)/sizeof(people[0]); qsort(people, n, sizeof(Person), compare_age); for(size_t i=0; i<n; i++) { printf("%s: %d\n", people[i].name, people[i].age); } return 0; } /* 输出: Bob: 20 Charlie: 22 Alice: 25 */ ``` 💡 **排序原理** `qsort()`内部实现为快速排序算法,平均时间复杂度为$O(n \log n)$,通过自定义比较函数实现任意数据类型的排序[^1][^3]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天少点debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值