在c++++中使用指针对字符串数组排序的关键在于正确编写比较函数。1. 字符串数组元素是const char指针,排序实际是重排指针顺序而非字符串内容;2. 默认字典序排序需通过两次解引用获取字符串并用strcmp比较;3. 自定义规则如忽略大小写用strcasecmp、按长度用strlen差值、降序则交换比较参数;4. 注意避免错误转换void参数、不得修改字符串常量、注意平台差异如_stricmp与strcasecmp的区别。

在C++中,使用指针对字符串数组进行排序时,关键在于理解如何处理字符指针和如何编写比较函数。如果你用的是qsort或者想自定义排序规则(比如不区分大小写、按长度等),比较函数的写法就显得尤为重要。

下面是一些常见做法和技巧。

1. 基本结构:字符串数组与指针的关系
我们通常用 char* 或者 const char* 来声明字符串数组:
立即学习“C++免费学习笔记(深入)”;
const char* names[] = {"Tom", "Jerry", "Alice"};这个数组中的每个元素其实是一个指向字符串常量的指针。要排序这些字符串,实际上是在重新排列这些指针的顺序,而不是修改字符串本身。

排序一般使用标准库函数 qsort,它需要传入一个比较函数。比较函数的原型是:
int compare(const void* a, const void* b);
注意:这里的参数是两个 void* 指针,指向的是数组中的两个元素——也就是两个 const char* 指针。
2. 默认按字典序排序的比较函数
这是最常见的排序方式,相当于字符串默认的升序排列:
int compareString(const void* a, const void* b) {
const char* str1 = *(const char**)a;
const char* str2 = *(const char**)b;
return strcmp(str1, str2);
}解释一下:
-
a和b是指向数组元素的指针,所以要用*(const char**)解两次引用。 -
strcmp返回值决定了排序顺序:- 小于0表示
str1 - 等于0表示相等
- 大于0表示
str1 > str2
- 小于0表示
调用方式:
qsort(names, 3, sizeof(const char*), compareString);
3. 自定义排序规则的比较函数
有时候你可能希望按不同规则排序,比如:
✅ 不区分大小写的排序
int compareIgnoreCase(const void* a, const void* b) {
const char* str1 = *(const char**)a;
const char* str2 = *(const char**)b;
return strcasecmp(str1, str2); // Linux下可用,Windows下可以用 _stricmp
}✅ 按字符串长度排序
int compareByLength(const void* a, const void* b) {
const char* str1 = *(const char**)a;
const char* str2 = *(const char**)b;
return strlen(str1) - strlen(str2);
}✅ 降序排列(从后往前)
int compareReverse(const void* a, const void* b) {
const char* str1 = *(const char**)a;
const char* str2 = *(const char**)b;
return strcmp(str2, str1); // 把参数反过来就是倒序
}4. 注意事项和常见错误
-
不要直接用 `char
强转void*` 的内容**
很多人容易误写成这样:const char* str1 = (const char*)a; // ❌ 错了!a是指向指针的指针
正确写法是:
const char* str1 = *(const char**)a;
-
避免修改字符串常量的内容
如果你尝试修改数组中的字符串,比如:char* name = const_cast
(names[0]); strcpy(name, "Bob"); // ❌ 未定义行为 这会导致崩溃或不可预料的结果。
注意平台差异
比如strcasecmp在 Windows 上是_stricmp,跨平台项目建议封装一层适配。
基本上就这些。只要搞清楚比较函数怎么取到实际字符串,再根据需求调整返回值逻辑,实现起来就不难。









