C++ 字符串反转的七种实现方法详解

追风的人
追风的人
发布时间:2026-10-14| 5人浏览过
原创

在C++开发中,字符串反转是测试底层逻辑与掌握标准库用法的经典案例。针对不同的字符串存储类型(原生C风格指针 vs std::string对象),实现思路存在显著差异。本文将通过具体代码实例,演示从传统的双指针交换到现代的STL函数调用等多种反转策略。

目标与准备

我们需要实现字符串的反转操作。在C++中,字符串通常以两种形式存在:

  • C风格字符串:以 null 结尾的 char* 或 const char* 数组。
  • std::string 对象:C++标准库提供的类模板,具有更丰富的接口和内存管理。

真实操作顺序

第1步:理解C风格字符串的原地反转原理

对于不可修改的输入 const char*,通常需要分配新的内存空间来存储反转后的结果,因为直接修改常量数据会导致未定义行为。核心逻辑是使用“双指针”分别指向字符串首尾,交换元素后向中间靠拢。

/* 方法1:双指针交换(基础版)
 * 特点:逻辑清晰,空间复杂度 O(N),需要额外分配内存 */
char* strrev1(const char* str) {
    const size_t length = strlen(str);
    char *temp = new char[length + 1]; // 注意长度+1以容纳结束符
    strcpy(temp, str);
    
    for (size_t i = 0; i <= length / 2; ++i) {
        char c = temp[i];
        temp[i] = temp[length - i - 1];
        temp[length - i - 1] = c;
    }
    return temp;
}

第2步:使用指针算术进行反转

该方法与方法1类似,但通过直接移动指针而非数组索引进行操作,代码更为紧凑。返回时需保存初始指针以便调用者释放内存。

/* 方法2:指针算术法
 * 特点:避免重复计算strlen,利用指针偏移访问内存 */
char* strrev2(const char* str) {
    char* tmp = new char[strlen(str) + 1];
    strcpy(tmp, str);
    char* ret = tmp;      // 记录起始位置用于返回
    char* p = tmp + strlen(str); // 指向末尾'
    --p;                  // 指向最后一个有效字符
    
    while (tmp < p) {
        char t = *tmp;
        *tmp++ = *p;
        *p-- = t;
    }
    return ret;
}

第3步:利用异或运算优化变量交换

在内存受限或追求极致性能的场景下,可以使用异或(XOR)操作在不使用临时变量的情况下交换两个整型或字符值。注意:此方法要求两个指针指向不同的内存地址。

/* 方法3:异或交换法
 * 注意:仅适用于不同地址的值交换,不能用于自身交换 */
char* strrev3(const char* str) {
    char* tmp = new char[strlen(str) + 1];
    strcpy(tmp, str);
    char* ret = tmp;
    char* p = tmp + strlen(str) - 1;
    
    while (tmp < p) {
        *tmp ^= *p;
        *p ^= *tmp;
        *tmp++ ^= *p;
    }
    return ret;
}

第4步:构建新字符串而非原地反转

如果不要求原地修改(in-place),可以直接创建新字符串并从原串尾部向前读取字符。这种方法逻辑简单,但时间复杂度略高且产生额外内存开销。

/* 方法4:逆向拷贝法
 * 特点:代码简洁,适合对性能要求不高且需保留原串的场景 */
char* strrev4(const char* str) {
    size_t len = strlen(str);
    char *temp = new char[len + 1];
    for(int i = 0; i < len; i++) {
        temp[i] = str[len - 1 - i];
    }
    temp[len] = '\0'; // 确保字符串正确结束
    return temp;
}

第5步:递归实现的逻辑局限

递归可以优雅地表达反转逻辑,但在处理C风格字符串时存在限制:通常只能处理非const指针(因为要在原数组上交换),且每次递归都需要传递当前剩余长度,容易因栈深度过大导致崩溃。

/* 方法5:递归法
 * 缺点:修改原数组,仅适用于char*而非const char*;栈溢出风险 */
char* strrev5(char* str, int len) {
    if (len <= 1) return str;
    char t = *str;
    *str = *(str + len - 1);
    *(str + len - 1) = t;
    // 递归处理内部子串,注意指针偏移和长度缩减
    return strrev5(str + 1, len - 2);
}

第6步:std::string 的安全反转

当输入为 std::string 时,应优先使用类型安全的方法。若允许修改原串(传值或非const引用),可直接复用双指针逻辑;若传入 const string,则需生成新字符串。

/* 方法6a:生成新副本(输入为const string)*/
std::string strrev_string_const(std::string str) {
    std::string r = "";
    for(size_t i = 0; i < str.length(); ++i) {
        r = str[i] + r; // 头部插入,效率较低但直观
    }
    return r;
}

/* 方法6b:原地反转(输入为非const string)*/
std::string strrev_string_inplace(std::string str) {
    size_t len = str.length();
    for(size_t i = 0; i < len / 2; ++i) {
        char c = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = c;
    }
    return str;
}

第7步:推荐做法 — 使用 STL 标准库

在实际工程开发中,除非为了面试或学习底层原理,否则强烈建议使用 std::reverse 或简单的范围构造器。这是最安全、可读性最高且经过高度优化的方式。

#include 
#include 

// 对 std::string 进行原地反转的最简写法
void reverse_std_string(std::string& s) {
    std::reverse(s.begin(), s.end());
}

// 生成反转后的新字符串
std::string get_reversed_string(const std::string& s) {
    return std::string(s.rbegin(), s.rend());
}

完成判断

成功反转的标志是:
1. C风格字符串返回的新数组满足 strcmp(original_reverse, reversed_str) == 0。
2. std::string 类型的对象内容发生翻转,且长度保持不变。
3. 对于动态分配的 char*,确保在合适时机使用 delete[] 释放内存,防止泄漏。

简要总结

以上就是C++字符串反转五种及以上方法的详细内容,更多关于C++基础算法与STL应用的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。