首页 > 后端开发 > C++ > 正文

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

P粉602998670
发布: 2025-07-10 14:21:02
原创
519人浏览过

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++中如何用指针实现字符串数组排序 比较函数的编写技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号