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

C语言多字符数组声明及读取输出异常问题求助

问题分析与修复

1. 输入读取问题:fflush(stdin)的错误用法

C标准中fflush()仅对输出流有效,对输入流使用fflush(stdin)属于未定义行为,不同编译器表现不一致(比如GCC下完全无效),这是你无法正确读取第二个数组的核心原因之一。

正确的输入缓冲区清理方式是手动读取并丢弃残留的换行/空白字符:

scanf("%s", S);
// 清除输入缓冲区中剩余的所有字符直到换行或EOF
int c;
while ((c = getchar()) != '\n' && c != EOF);
scanf("%s", T);

另外,scanf("%s")本身会自动跳过前导空白(包括空格、换行),如果输入是连续的两个无空格字符串(比如abc def),无需清理缓冲区也能正常读取,但如果输入第一个字符串后按回车再输入第二个,上述清理代码能确保缓冲区无残留,避免意外问题。

2. 输出逻辑的致命错误

你的输出代码中,strchr(T, ch)如果找不到对应字符会返回NULL,直接解引用NULL(*strchr(...))会触发未定义行为,导致程序崩溃、乱输出,甚至看起来像是T数组为空。

必须先判断strchr的返回值是否非空,再输出字符:

for(char ch = 'a'; ch <= 'z'; ch++)
{
    if (strchr(T, ch) != NULL)
    {
        printf("%c", ch);
    }
}

这样只会输出T中存在的字符,且按a到z的顺序排列,自动实现去重(每个字母仅检查一次)。

完整修复后的代码

#include <stdio.h>
#include <string.h>

int main()
{
    char S[50], T[50]; 
    // 限制输入长度,避免缓冲区溢出
    scanf("%49s", S);
    
    // 清理输入缓冲区
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    
    scanf("%49s", T); 
    
    // 按字母顺序输出T中出现的不同字符
    for(char ch = 'a'; ch <= 'z'; ch++)
    {
        if (strchr(T, ch)) // 等价于strchr(T, ch) != NULL
        {
            printf("%c", ch);
        }
    }
    printf("\n"); // 可选:输出换行符,让结果更整洁
    return 0;
}

额外说明

  • 如果需要支持带空格的字符串输入,不要用scanf("%s"),改用fgets(),同时手动去除读取到的换行符:
    fgets(S, sizeof(S), stdin);
    S[strcspn(S, "\n")] = '\0'; // 去除换行符
    fgets(T, sizeof(T), stdin);
    T[strcspn(T, "\n")] = '\0';
    
  • 使用scanf("%49s")而非scanf("%s"),是为了限制输入长度,避免超出数组大小导致缓冲区溢出。

内容的提问来源于stack exchange,提问作者Thanh Phạm Văn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:27:24