C++中如何用指针实现字符串数组排序 比较函数的编写技巧

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

C++中如何用指针实现字符串数组排序 比较函数的编写技巧

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

C++中如何用指针实现字符串数组排序 比较函数的编写技巧

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

C++中如何用指针实现字符串数组排序 比较函数的编写技巧


1. 基本结构:字符串数组与指针的关系

我们通常用 char* 或者 const char* 来声明字符串数组:

立即学习C++免费学习笔记(深入)”;

const char* names[] = {"Tom", "Jerry", "Alice"};

这个数组中的每个元素其实是一个指向字符串常量的指针。要排序这些字符串,实际上是在重新排列这些指针的顺序,而不是修改字符串本身。

C++中如何用指针实现字符串数组排序 比较函数的编写技巧

排序一般使用标准库函数 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

调用方式:

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<char*>(names[0]); strcpy(name, "Bob"); // ❌ 未定义行为

    这会导致崩溃或不可预料的结果。

  • 注意平台差异
    比如 strcasecmp 在 Windows 上是 _stricmp,跨平台项目建议封装一层适配。


基本上就这些。只要搞清楚比较函数怎么取到实际字符串,再根据需求调整返回值逻辑,实现起来就不难。

以上就是C++中如何用指针实现<a

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享