std::sort 可直接排序以 '\0' 结尾的 C 风格字符数组,需传入正确范围:已知长度 n 用 std::sort(arr, arr + n),或用 strlen 获取长度;切勿用 sizeof(arr);默认按 ASCII 升序、大小写敏感。

用 std::sort 直接排序字符数组(C 风格)
只要数组以 '\0' 结尾且你只关心有效字符,std::sort 可以直接用——它不关心是不是 C 字符串,只按字节值比较。但必须传入正确的迭代器范围,否则会越界或漏排。
- 确保数组有明确边界:如果已知长度为
n,用std::sort(arr, arr + n);若依赖'\0',先用strlen获取长度:std::sort(arr, arr + strlen(arr)) - 别写成
std::sort(arr, arr + sizeof(arr))——sizeof对指针返回 4 或 8,不是数组长度 -
std::sort默认升序,按 ASCII 值排,大小写敏感:'A' (65)'a' (97),所以"BaC"排完是"BCa"
处理大小写不敏感的字母序排序
标准 std::sort 不自带忽略大小写的比较逻辑,必须自己提供比较函数。不能简单用 tolower 处理整个字符串再排,因为排序需要两两比较。
- 写一个 lambda 或函数对象,对两个
char分别转小写后再比较:std::sort(arr, arr + len, [](char a, char b) { return std::tolower(static_cast<unsigned char>(a)) < std::tolower(static_cast<unsigned char>(b)); }); - 务必加
static_cast<unsigned char></unsigned>:防止char为负时传给tolower导致未定义行为(常见于非 ASCII 环境或某些编译器) - 这个比较器只影响排序顺序,不修改原数组内容
用 std::string 替代裸字符数组更安全
裸 char[] 容易出边界、长度误判、内存管理问题。绝大多数场景下,优先用 std::string。
- 初始化:
std::string s = "Hello";,排序:std::sort(s.begin(), s.end()) - 大小写不敏感排法一样:传自定义比较器,
s.begin()和s.end()自动给出正确范围 - 避免
strlen、手动算长度、担心'\0'位置——std::string的size()总是可靠 - 如果必须和 C API 交互,用
s.c_str()获取只读 C 字符串,或&s[0](C++11 起保证连续)获取可写缓冲区
常见错误:把字符数组当 std::string 用 sort 却没指定范围
写成 std::sort(str.begin(), str.end()) 看似简洁,但如果 str 是 char arr[10] 类型,arr.begin() 根本不存在——编译失败。只有 std::array 或 std::vector 有 begin()/end(),原始数组没有。
立即学习“C++免费学习笔记(深入)”;
- 错误示例:
char buf[100]; std::sort(buf.begin(), buf.end());→ 编译报错:error: 'begin' is not a member of 'char [100]' - 正确写法只有两种:
std::sort(buf, buf + n)(n 已知),或先封装成std::string(buf)再排 - 如果数组未初始化或含随机垃圾值,
strlen(buf)可能找不到'\0',导致越界读——这是运行时崩溃的常见原因
std::sort 写得再漂亮也白搭。


















