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

C++中使用指针实现函数反转C风格字符串的问题

解决C风格字符串反转后输出乱码的问题

嘿,刚上手指针和C字符串碰到这种问题太正常啦!你输入"hello"后输出的那些乱码,本质是因为你的反转字符串没有正确以**'\0'(字符串结束符)**结尾,或者目标字符串的内存处理出了问题,导致printf读取到了内存里的垃圾数据。我来帮你拆解问题并给出解决方案:

最可能的两个错误原因

1. 反转函数没添加字符串结束符

C风格字符串必须以'\0'结尾,否则任何读取字符串的函数(比如printf、strlen)都会一直往内存深处读,直到随机碰到一个'\0',中间读到的就是你看到的乱码。

很多新手写反转函数时,只复制了字符,忘了在最后补上这个关键的结束符:

// 错误示例:没加'\0'
void reverse(char *dest, char *src) {
    int len = strlen(src);
    for (int i = 0; i < len; i++) {
        dest[i] = src[len - 1 - i];
    }
    // 这里缺少:dest[len] = '\0';
}

2. 目标字符串内存空间不足/未初始化

如果你的目标字符串(dest)是未初始化的指针,或者数组大小不够(比如源字符串是5个字符的"hello",但目标数组只定义了char dest[5];,没留'\0'的位置),就会出现内存越界写入,破坏其他内存区域的数据,同样会导致乱码。

修复后的完整代码示例

这里给你一个能正常运行的版本,每一步都标注了关键点:

#include <stdio.h>
#include <string.h>

// 用const修饰src,表明我们不会修改源字符串,是良好的编程习惯
void reverse_string(char *dest, const char *src) {
    int str_length = strlen(src);
    
    // 逐个字符反转复制
    for (int i = 0; i < str_length; i++) {
        dest[i] = src[str_length - 1 - i];
    }
    // 必须添加字符串结束符!这是解决乱码的核心
    dest[str_length] = '\0';
}

int main() {
    char src[100];
    printf("请输入一个单词:");
    // %s会自动读取空格前的内容,并在末尾添加'\0'
    scanf("%s", src);

    // 目标数组的长度要等于源字符串长度+1,刚好容纳反转字符和结束符
    char dest[strlen(src) + 1];
    reverse_string(dest, src);

    printf("反转后的字符串:%s\n", dest);
    return 0;
}

额外注意事项

  • 绝对不能传野指针给dest:比如直接写char *dest;然后传给函数,这会导致未定义行为(可能崩溃或输出乱码)。必须给dest分配足够的内存(比如用数组,或者malloc动态分配)。
  • 确保源字符串本身是合法的:输入的字符串必须以'\0'结尾,scanf("%s")会帮你处理这一点,但如果是手动构造的字符串,一定要记得加结束符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:32:49