【算法】C语言使用qsort对字符串字符进行排序(解决字符串长度不统一的问题)

核心思想是

  • 当a的长度>b时,a一定比b大
  • 当a,b长度相等时,通过strcmp比较哪个字典序大,也就是实际的数哪个大
  • 当a的长度<b是,b一定比a大
    这时候就不得不感慨C++的string是多么好用的,哎
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int compare1(const void *a,const void *b){
   
   
	printf("(char*)a:%s\n",(char*) a);			//代表的是实际的数据,如例子中的"123","456","123032"
	if(strlen((char*)a)>strlen((char*)b))	return 1;
	else if(strlen((char*
在C语言中,`qsort` 函数可以用于对字符串数组进行排序。`qsort` 是标准库 `<stdlib.h>` 中定义的函数,其功能是实现快速排序算法,可以对任意类型的数据进行排序,但需要提供一个比较函数作为参数。对于字符串数组的排序,比较函数需要按照字符串的字典序(lexicographical order)进行比较 [^1]。 ### 字符串数组排序的代码示例 以下是一个完整的示例,展示如何使用 `qsort` 对字符串数组进行排序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 比较函数:用于按字典序升序排序 int compare_strings(const void *a, const void *b) { return strcmp(*(const char**)a, *(const char**)b); } int main() { const char *words[] = {"banana", "apple", "orange", "grape", "cherry"}; int num_words = sizeof(words) / sizeof(words[0]); // 使用 qsort字符串数组排序 qsort(words, num_words, sizeof(const char*), compare_strings); // 输出排序后的结果 for (int i = 0; i < num_words; i++) { printf("%s ", words[i]); } return 0; } ``` #### 代码解析 1. **比较函数 `compare_strings`**:该函数接收两个指向字符串的指针(`const void*` 类型),将其转换为 `const char**` 类型,然后通过 `strcmp` 函数比较两个字符串。`strcmp` 返回值为负、零或正分别表示第一个字符串小于、等于或大于第二个字符串。 2. **调用 `qsort` 函数**:`qsort` 的参数包括待排序的数组 `words`、数组的大小 `num_words`、每个元素的大小 `sizeof(const char*)`,以及比较函数 `compare_strings`。排序后的数组将按字典序升序排列 [^1]。 ### 降序排序 如果希望按字典序降序排序,可以修改比较函数,将 `strcmp` 的参数顺序调换: ```c int compare_strings_desc(const void *a, const void *b) { return strcmp(*(const char**)b, *(const char**)a); } ``` ### 注意事项 1. **字符串指针数组的类型**:字符串数组通常由指针组成(如 `const char* words[]`),因此排序时操作的是指针,而非字符串本身。比较函数需要解引用两次指针以获取字符串的实际内容。 2. **避免修改字符串常量**:字符串常量(如 `"apple"`)存储在只读内存中,因此能直接修改。排序时仅交换指针的位置,会影响字符串的内容 [^1]。 ### 相关问题 1. C语言中指针类型转换的注意事项有哪些? 2. 解释比较函数在 `qsort` 中的工作原理。 3. 如何修改比较函数以实现同的排序规则?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值