如何在C语言中读取输入前清空未处理的stdin输入缓冲区?
问题解决:延时期间提前输入导致跳过后续输入步骤
你的问题核心是延时阶段用户输入的内容会留在stdin缓冲区中,等延时结束后,req_input里的fgets会直接读取这些残留内容,导致跳过了等待用户主动输入的环节。
修复方案
在延时结束后、调用req_input之前,主动清空stdin的所有残留输入,确保后续的输入等待是针对用户的新操作。
修复后的代码
#include <stdio.h> #include <string.h> #include <time.h> // 基于实际时间的延时函数,比clock()更准确 void delay(float time_in_s) { time_t start_time = time(NULL); while (difftime(time(NULL), start_time) < time_in_s); } // 彻底清空stdin缓冲区的函数 void clear_stdin() { int c; // 循环读取直到缓冲区为空或遇到换行/EOF while ((c = fgetc(stdin)) != EOF && c != '\n'); } void req_input() { // 用足够大的缓冲区避免截断 char tmp[32]; fgets(tmp, sizeof(tmp), stdin); // 确保清空用户可能输入的多余字符 clear_stdin(); } int main(void) { printf("Hello world\n"); delay(2); // 关键步骤:清空延时期间的所有残留输入 clear_stdin(); printf("Press enter to end program.\n"); req_input(); printf("Ending program only after input AFTER delay.\n"); return 0; }
关键修改说明
- 改进延时函数:替换
clock()为time()+difftime(),计算实际流逝的墙上时间,避免CPU调度导致的延时不准问题。 - 独立的清空函数:
clear_stdin不需要依赖传入的字符串,直接遍历stdin缓冲区,确保彻底清除残留内容。 - 提前清空缓冲区:在延时结束后立即调用
clear_stdin,把用户在延时期间输入的所有内容(包括换行)都清空,保证后续req_input会等待用户的新输入。 - 调整缓冲区大小:原来的
char tmp[1]无法正常读取输入(fgets需要留位置存终止符),改成char tmp[32]更合理。
内容的提问来源于stack exchange,提问作者DevonMartin
相关产品推荐
相关产品推荐

