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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:09:01