推荐使用 std::reverse 反转 std::string,时间 O(n)、空间 O(1),安全高效;处理 C 风格字符串需确保可写且正确传入终止位置,避免越界或未定义行为。

直接用 std::reverse 最快最安全,别手写循环——除非你明确需要原地、无额外空间或兼容 C 风格字符串。
用 std::reverse 反转 std::string
这是标准且推荐的做法,底层调用双向迭代器交换,时间 O(n),空间 O(1):
#include#include #include std::string s = "hello"; std::reverse(s.begin(), s.end()); // 直接修改原串 // s 现在是 "olleh"
- 必须传入合法的双向迭代器范围:
s.begin()到s.end(),不能反着传 - 对空串、单字符串也安全,无需额外判空
- 不适用于
const std::string&—— 因为会修改原对象
反转 C 风格字符串(char*)要小心越界
std::reverse 也能处理 C 字符串,但必须手动提供结束位置,否则会越界读写:
char cstr[] = "world"; std::reverse(cstr, cstr + std::strlen(cstr)); // ✅ 正确:到 '\0' 前为止 // cstr 变成 "dlrow"
- 千万别写
std::reverse(cstr, cstr + 6)这种硬编码长度——易错且不可移植 - 如果
cstr是只读字符串字面量(如"hello"),传给std::reverse会导致未定义行为(试图修改只读内存) - 用
std::strlen前确保字符串以'\0'结尾,否则会内存越界扫描
不用 ?手写循环要注意边界和类型
某些嵌入式或受限环境禁用 STL,此时需手写。常见错误是循环条件写成 i 导致中间字符被翻转两次:
立即学习“C++免费学习笔记(深入)”;
void reverse_cstr(char* s) {
if (!s) return;
int i = 0, j = 0;
while (s[j]) ++j; // 找结尾
--j; // 跳过 '\0'
while (i < j) { // ❌ 不是 i <= j
std::swap(s[i++], s[j--]);
}
}
- 使用
size_t更稳妥,但要注意j为 0 时再减会回绕成极大值——所以先判空或用有符号索引 - 交换用
std::swap比手动临时变量更清晰,且对类类型也适用 - 如果目标是返回新字符串而非原地修改,记得用
std::string(s.rbegin(), s.rend()),比手写分配+拷贝更简洁
真正容易出问题的不是“怎么翻”,而是“翻谁”和“翻到哪”——std::string 的 end()、C 字符串的 '\0' 位置、指针可写性,这三个点漏掉任何一个都会导致崩溃或静默错误。










