C语言自定义字符排序后数组打印乱码问题求助
问题出在缺了一个关键的结束符!
嘿,我一眼就瞅到问题根源了——你用来存结果的orderedChars数组没有添加字符串结束标志'\0'。C语言里,用printf("%s")打印字符串的时候,它会从数组开头一直输出字符,直到碰到'\0'才会停下来。你现在只给数组塞了n个字符,末尾没这个终止符,printf就会“越界”去读后面的内存垃圾,也就是你看到的那些乱码。
至于n≥7时看起来正常?那纯粹是运气好——刚好数组后面的内存里碰巧有个'\0',但这是完全不可靠的“未定义行为”,换个环境说不定就又出问题了,绝对不能依赖。
怎么修复?
1. 给结果数组加上结束符
循环结束后,直接给orderedChars的第n个位置赋值'\0'就行,毕竟你定义数组的时候就留了n+1的空间,刚好够放:
for (int i = 0; i < n; i++) { int index; scanf("%d", &index); orderedChars[i] = characters[index - 1]; } // 加这一行,告诉printf什么时候停 orderedChars[n] = '\0';
2. 顺带优化:处理fgets的换行符
另外,fgets会把你输入字符时敲的回车键(也就是'\n')也读进characters数组里,如果输入的字符长度刚好是n还好,要是短一点的话,这个换行符就会留在数组里,可能影响后续操作。可以加一段代码把它去掉:
fgets(characters, n + 1, stdin); // 去掉fgets带进来的换行符 size_t len = strlen(characters); if (len > 0 && characters[len - 1] == '\n') { characters[len - 1] = '\0'; }
注意要包含string.h头文件才能用strlen哦。
修复后的完整代码
#include <stdio.h> #include <string.h> int main() { int n; scanf("%d", &n); fgetc(stdin); // 吃掉scanf留下的换行符,避免fgets直接读空 char characters[n + 1]; fgets(characters, n + 1, stdin); // 移除fgets读取的换行符 size_t len = strlen(characters); if (len > 0 && characters[len - 1] == '\n') { characters[len - 1] = '\0'; } char orderedChars[n + 1]; for (int i = 0; i < n; i++) { int index; scanf("%d", &index); orderedChars[i] = characters[index - 1]; } orderedChars[n] = '\0'; // 关键:添加字符串结束符 printf("%s\n", orderedChars); // 加个换行让输出更清爽 return 0; }
这样改完之后,不管n是多少,输出都只会是你想要的排序后的字符,不会再出现乱码啦。
内容的提问来源于stack exchange,提问作者The Programming M16A4
相关产品推荐
相关产品推荐

