#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i <sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int cmp_int(const void* p1, const void* p2)
{
if (*(int*)p1 > *(int*)p2)
return 1;
else if (*(int*)p1 < *(int*)p2)
return -1;
else
return 0;
}
//测试qsort来排序整型数据
void test1()
{
int arr[] = { 3,1,2,4,7,6,5,8,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
print_arr(arr,sz);
printf("\n");
}
struct stu
{
char name[20];
int age;
};
//测试qsort来排序结构体数据
//按照名字比较两个结构体数据
int cmp_name(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
struct stu arr[] = { {"zhangsan",20},{"wangwu",23},{"lili",19} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_name);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s %d \n",arr[i].name,arr[i].age);
}
printf("\n");
}
//按照年龄比较两个结构体数据
int cmp_age(const void* p1, const void* p2)
{
return ((struct stu*)p1)->age-((struct stu*)p2)->age;
}
void test3()
{
struct stu arr[] = { {"zhangsan",20},{"wangwu",23},{"lili",19} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_age);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s %d \n", arr[i].name, arr[i].age);
}
printf("\n");
}
int main()
{
printf("测试qsort来排序整型数据\n");
test1();
printf("测试qsort来排序结构体数据\n");
printf("按照名字比较两个结构体数据\n");
test2();
printf("测试qsort来排序结构体数据\n");
printf("按照年龄比较两个结构体数据\n");
test3();
}
测试结果:
刚刚这一长串代码,是1.完整版的结构体比较大小,那么接下来我们拆分一下重点部分的知识点!
1.strcmp
(1)大家知道strcmp是干什么用的吗?
strcmp是用来比较字符串的大小,但是它不是用来比较字符串的长度,而是用来比较对应位置上字符串的大小
举个例子:
a b c d e f
a b c q e f
这两串字符是不是长度是一样的?那么如果用strcmp比较他们的大小,他们会是一样的吗?
很明显不是一样的.因为d 和q 不一样.
(2)strcmp的使用方法
#include<stdio.h>
#include<string.h>
int main()
{
char a="abcdrf";
char b="abcfer";
strcmp(a,b);
return 0;
}
如果a,b值一样返回0;
如果a值大于b返回正数;
如果a值小于b返回负数;
2.结构体
(1).结构体成员访问操作符
结构体变量.成员名
结构体指针->成员名
(2)打印结构体的内容
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu a = {"zhangsan",20};
printf("%s %d\n", a.name, a.age);
struct stu*p = &a;
printf("%s %d\n", (*p).name, (*p).age);
return 0;
}
输出结果:
(3)打印结构体数组的内容
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu arr[3] = { {"zhangsan",20},{"lisi",23},{"wangwu",18} };
printf("%s %d\n",arr[1].name,arr[1].age);
struct stu(*p)[3] =&arr;
printf("%s %d\n", (*p)[1].name,(*p)[1].age);
return 0;
}
输出结果:
3.qsort
void qsort (void *base, //指向待排序数组的第一个元素的指针
size_t num, //base指向数组中元素的个数
size_t size, //base指向的数组中一个元素的大小,单位是字节
int (*cmp)(const void*,const void*)) //函数指针------传递函数的地址