C语言通讯录搜索功能跳过姓名输入直接返回菜单问题排查
问题产生原因
- 核心是输入缓冲区残留换行符导致:调用
scanf_s("%d", &select)读取菜单选项整数时,函数仅提取输入流中的数字字符,用户输入完成后按下的回车对应的\n换行符会残留在标准输入缓冲区中。 - 代码中使用的
fflush(stdin)是C标准未定义的行为,仅在部分老版本VS编译器中可生效,多数场景下无法完成输入缓冲区清空操作。 - 后续执行
gets_s(name, SIZE)时,函数会直接读取到缓冲区中残留的换行符,判断为输入结束,因此直接跳过了用户输入流程,返回空字符串后逻辑执行结束回到主菜单。
对应解决方案
方案1:scanf读取后手动清空输入缓冲区
在scanf_s("%d", &select)执行完成后,添加代码手动读取并丢弃输入缓冲区中直到换行符的所有残留内容,替换原有的无效fflush(stdin)逻辑:
// 放在 scanf_s("%d", &select); 之后执行 int c; while ((c = getchar()) != '\n' && c != EOF);
同时可以删除search_record函数中的fflush(stdin)语句,避免无意义操作。
方案2:统一使用行输入逻辑处理所有输入
避免混用数值输入函数和行输入函数,所有输入统一通过fgets读取整行内容后再做解析,兼容性更强,从根源避免换行残留问题:
// 原读取菜单选项的逻辑替换为: char buf[SIZE]; fgets(buf, SIZE, stdin); sscanf_s(buf, "%d", &select);
内容的提问来源于stack exchange,提问作者Space_SG
相关产品推荐
相关产品推荐

