为什么if语句内调用fgets函数无法正常读取用户输入?
问题根源
该问题由标准输入缓冲区的残留换行符导致:
- 调用
scanf_s("%d", &menu_num)读取菜单数字时,仅会提取输入内容中的数字部分,用户按下回车生成的\n换行符会残留在stdin输入缓冲区中 - 后续执行
fgets操作时,会直接读取到缓冲区中残留的换行符,判定为已经完成一行输入,因此不会等待用户输入新内容,直接返回菜单界面。
修复方案
在scanf_s读取菜单数字完成后、执行fgets操作前,清空输入缓冲区的残留内容即可,参考修复代码如下:
int main() { while (1) { printf("The following options are available \n" "Read in data [1] \n" "Print out catalogue to screen [2] \n" "Save data to file [3] \n" "Exit Program [4] \n" "Enter your choice now "); scanf_s("%d", &menu_num); // 新增代码:清空输入缓冲区残留的换行及其他冗余字符 int c; while ((c = getchar()) != '\n' && c != EOF); if (menu_num == 1) { printf("Name of band of Singer: "); fgets(hold[0].singer, 20, stdin); } // 原有其他逻辑 } }
如果你的场景能确保缓冲区仅残留单个换行符,也可以简化为while(getchar()!='\n');。
内容的提问来源于stack exchange,提问作者Python Asker
相关产品推荐
相关产品推荐

