调用fgets时printf输出后无法输入内容的技术问题求助
问题分析与解决办法
问题根源在于fflush(stdin)——C标准明确规定fflush仅对输出流或更新流(既读又写的流)有效,将其用于输入流stdin属于未定义行为,不同编译器的处理逻辑不一致,会直接导致后续fgets无法正常读取用户输入。
解决步骤
- 移除
fflush(stdin),替换为手动清空输入缓冲区的逻辑 - 保留
fgets以支持读取包含空格的完整字符串
修改后的代码
typedef struct { char name[20]; }NAME_1; static void ex6() { NAME_1 name; int c; // 手动清空输入缓冲区残留的字符 while ((c = getchar()) != '\n' && c != EOF); printf("Name: "); fgets(name.name, 20 , stdin); // 去除fgets读取到的换行符(若存在) name.name[strcspn(name.name, "\n")] = '\0'; printf("Name: %s\n", name.name); }
额外说明
- 手动清空缓冲区的循环会读取输入流中所有残留字符(直到换行符或EOF),确保
fgets能获取到用户新输入的内容 strcspn函数会定位到换行符的位置,将其替换为字符串结束符\0,避免输出时多出空行
内容的提问来源于stack exchange,提问作者Guerra
相关产品推荐
相关产品推荐

