C语言调用scanf后fgets未执行无输入提示的原因及解决方法
问题产生原因
你的代码存在两个导致该现象的问题:
- 输入缓冲区残留问题:
scanf("%d", &num)执行时仅读取整数部分,用户输入结束按下的换行符\n会残留在标准输入缓冲区中。后续调用fgets时,会优先读取缓冲区中已存在的换行符,直接将其作为输入内容存入answer数组,无需等待用户手动输入。 fgets读取内容格式问题:fgets读取用户输入时,会将输入末尾的换行符一并存入目标数组,因此即使用户正常输入yes,answer的实际内容是yes\n,和你预设的yes字符串比较结果也不为0,循环无法正常进入下一轮。
可行解决方法
- 方法1:清空输入缓冲区并处理
fgets读入的换行符
在scanf("%d", &num);后添加代码清空残留内容,再在fgets读取后去掉末尾的换行符:// scanf后添加,清空缓冲区残留 while (getchar() != '\n'); // fgets读取后添加,去掉末尾换行符 answer[strcspn(answer, "\n")] = '\0'; - 方法2:使用带空白前缀的
scanf读取确认信息
把fgets调用替换为scanf(" %s", answer);,格式字符串开头的空格会自动跳过所有前置空白字符(包括残留的换行符),且%s不会读入换行符,无需额外处理字符串即可直接和yes比较。 - 方法3:统一使用
fgets处理所有输入
避免混合使用scanf和fgets,整数输入也用fgets读取后再通过strtol/atoi转换成整型,从根源上避免缓冲区残留问题,同样需要处理读入字符串的末尾换行符。
内容的提问来源于stack exchange,提问作者csg4786
相关产品推荐
相关产品推荐

