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
相关产品推荐
相关产品推荐

