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
相关产品推荐
相关产品推荐

