VSCode中执行C语言字符串反转代码出现额外字符的原因
问题分析与解决方案
核心问题
你的代码存在两个关键错误,导致出现额外字符:
字符串数组无终止符
char text[12] = "this is text";中,"this is text"恰好包含12个可见字符,但C语言要求字符串必须以'\0'结尾才能被正确识别。数组长度仅为12,没有空间存放终止符,导致reverse函数处理text时会越界读取栈上的无关内存,直到偶然找到'\0',期间输出的随机字节就是你看到的Ç。递归终止条件逻辑不严谨
reverse函数用if(arr[1]!='\0')作为递归判断条件,虽然对正常带终止符的字符串能工作,但无法处理无终止符的情况,会导致无限递归或越界读取内存。
修正后的代码
#include <unistd.h> void reverse(const char arr[]) { if (arr[0] != '\0') { // 正确终止条件:当前字符为空时停止递归 reverse(&arr[1]); write(1, &arr[0], 1); } } int main() { char text[13] = "this is text"; // 数组大小设为13,容纳12个字符+终止符 reverse("try "); reverse(text); return 0; }
关键修改说明
- 调整
text数组大小为13,确保能存放字符串终止符'\0',让reverse函数可以正确识别字符串结束位置。 - 把递归终止条件改为
arr[0] != '\0',逻辑更直观,同时能避免无终止符字符串导致的越界问题。 - 将函数参数改为
const char arr[],符合字符串字面量只读的特性,消除编译器潜在警告。
修正后输出应为 yrt txet si siht(注意"try "反转后开头有空格),不会出现额外字符。
内容的提问来源于stack exchange,提问作者Mahami
相关产品推荐
相关产品推荐

