C语言反向拷贝字符串出现乱码及程序无法运行如何解决?
C语言字符串反向拷贝问题修复方案
问题1:输出带乱码的根因
- C语言字符串必须以
\0作为结束标志,你完成反向拷贝后没有给copy数组手动添加结束符,printf用%s输出时会连续读取内存数据直到遇到\0,超出copy有效内容的内存垃圾数据就会显示为乱码。 - 你当前的长度计算逻辑可以运行,但存在冗余,
length和length2两个变量完全可以合并简化。
问题2:定义char copy[length2]后无法运行的根因
- 这种用变量定义数组长度的语法叫变长数组(VLA),仅在C99及更高标准中支持,如果你使用的编译器默认遵循C89标准,会直接编译失败无法生成可执行程序。
- 就算编译器支持C99,变长数组分配在栈空间,也存在栈溢出风险,更推荐用固定长度数组或者动态内存分配实现。
修复后的可运行代码
#include <stdio.h> #include <string.h> #define ARR_SIZE 50 int main() { char string[ARR_SIZE]; printf("Enter char array!\n"); fgets(string, ARR_SIZE, stdin); // 替换fgets读取的末尾换行符为结束符 string[strlen(string) - 1] = '\0'; int len = strlen(string); printf("%s\t%d\n", string, len - 1); for (int i = 0; i < len; i++) { printf("INDEX = %d CHAR = %c\n", i, string[i]); } char copy[ARR_SIZE]; for (int i = 0; i < len; i++) { copy[i] = string[len - 1 - i]; } // 必须手动添加字符串结束符 copy[len] = '\0'; printf("\n反向拷贝结果:%s", copy); return 0; }
内容的提问来源于stack exchange,提问作者notmenotyou
相关产品推荐
相关产品推荐

