C语言调用scanf后gets()无法接收输入,代码异常排查求助
问题原因
- 输入缓冲区残留换行符
scanf("%c%s", &ch, &s);执行完成后,你输入结束时按下的换行符\n会残留在标准输入缓冲区中。gets()的读取逻辑是读到换行符就立即停止读取并将换行符替换为字符串结束符\0,因此它会直接读取到残留的换行符,返回空字符串,不会等待你输入新内容。 - 代码瑕疵&不安全函数问题
数组名s本身就代表数组的首地址,传入scanf时不需要加取地址符&,写&s属于错误写法;此外gets()函数没有输入长度校验,容易引发缓冲区溢出漏洞,已经从C11标准中被正式移除,不建议继续使用。
修复方案
可以在scanf执行后主动读取走残留的换行符,同时替换gets为更安全的fgets,参考代码如下:
#include<stdio.h> int main() { char ch, s[20], sen[100]; scanf("%c%s", &ch, s); // 吃掉缓冲区残留的换行符 getchar(); // fgets指定最大读取长度,避免溢出 fgets(sen, sizeof(sen), stdin); printf("%c\n%s\n%s", ch, s, sen); return 0; }
内容的提问来源于stack exchange,提问作者Md Nasir Ahmed
相关产品推荐
相关产品推荐

