You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:32:44