C语言反转字符串输出随机乱码、每次运行结果不一致如何修复?
问题原因
- 反转后的字符数组
rev没有手动添加C字符串必需的结束标志\0,printf用%s输出时会持续读取后续栈内存的随机垃圾值,直到遇到内存中随机存在的\0才停止,因此会出现乱码,且每次运行时栈内存的随机值不同,输出结果也不一样。 fgets读取输入时会将末尾的换行符\n一同存入数组,当前逻辑会将换行符也参与反转,会导致输出结果开头或末尾多出无效换行。
修复代码
#include <stdio.h> #include <string.h> #define LEN 20 void reverse(char w[LEN]); int main() { char word[LEN]; reverse(word); return 0; } void reverse(char w[LEN]) { char rev[LEN]; int i, j, len; fgets(w, LEN, stdin); // 移除fgets读入的末尾换行符 len = strlen(w); if (w[len - 1] == '\n') { w[len - 1] = '\0'; len--; } // 反转逻辑 for (i = 0, j = len - 1; i < len; i++, j--) { rev[j] = w[i]; } // 手动添加字符串结束符 rev[len] = '\0'; printf("%s\n", rev); return; }
验证效果
输入bathroom时,输出固定为moorhtab,无乱码。
内容的提问来源于stack exchange,提问作者reshi
相关产品推荐
相关产品推荐

