You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用strlen函数反转并打印C字符串?

反转并打印C字符串的正确实现

原代码存在的问题

  • char backwards[]; 声明非法:C++不允许定义未指定大小且无初始化的数组,编译器会直接报错。
  • forward[-i -1] 索引错误:数组索引不能为负数,这会访问超出字符串范围的非法内存,触发未定义行为。
  • 未添加字符串终止符:即便成功填充数组,没有'\0'的情况下,cout打印时会读取随机内存内容,导致乱码。

方案1:直接倒序打印(无需额外数组,高效简洁)

不需要创建新数组,先获取字符串长度,从最后一个有效字符开始倒序遍历打印即可:

#include <iostream>
#include <cstring> // 用于strlen函数

void printBackwards(char forward[]) {
    // 获取字符串有效长度(不含终止符'\0')
    int len = strlen(forward);
    // 从最后一个字符开始倒序输出
    for (int i = len - 1; i >= 0; --i) {
        std::cout << forward[i];
    }
    std::cout << std::endl; // 可选:打印换行符
}
  • strlen(forward) 会自动计算到'\0'之前的字符总数,无需手动计数。
  • 直接遍历打印避免了额外内存分配,是最优的实现方式。

方案2:先反转字符串再打印(需额外内存)

如果必须先生成反转后的字符串再打印,需要正确分配内存并添加终止符:

#include <iostream>
#include <cstring>

void printBackwards(char forward[]) {
    int len = strlen(forward);
    // 分配足够内存:len个字符 + 1个终止符的空间
    char* backwards = new char[len + 1];
    // 填充反转后的字符
    for (int i = 0; i < len; ++i) {
        backwards[i] = forward[len - 1 - i];
    }
    // 必须添加字符串终止符,否则打印会乱码
    backwards[len] = '\0';
    // 打印反转后的字符串
    std::cout << backwards << std::endl;
    // 释放动态分配的内存,避免内存泄漏
    delete[] backwards;
}

内容的提问来源于stack exchange,提问作者ajcheng12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:31:15