C语言多次调用fgets读取输入出现跳读异常问题求助
fgets读取异常问题修复方案
问题根源
问题核心是ageString缓冲区长度不足导致输入缓冲区残留换行符:
fgets读取规则是最多读取【第二个参数值 - 1】个字符,遇到换行符直接停止,读取到的内容会自动在末尾补\0作为字符串结束符- 你定义的
ageString长度为3,因此fgets(ageString, 3, stdin)最多只能读2个有效字符。当你输入21并按下回车时,fgets只会读取'2'和'1'两个字符存入ageString,回车产生的\n会残留在标准输入缓冲区中 - 后续执行
fgets(num1, 6, stdin)时,会直接读取到缓冲区中残留的\n,因此num1被赋值为仅包含换行符的字符串,经过换行符替换逻辑后就变成了空字符串,也就出现了num1无值、提示语连在一起的异常现象
修复方案
方案1:扩大缓冲区长度(最推荐,实现最简单)
把ageString的数组长度适当调大,至少要能容纳你预期输入的最大年龄位数+换行符+结束符,调整为长度10就完全可以覆盖常规年龄输入场景,修改后的完整代码如下:
#include <stdio.h> #include <string.h> // 必须引入该头文件才能正常使用strcspn函数 int main(int argc, char const *argv[]) { char name[50]; char ageString[10]; // 调整缓冲区长度为10 char num1[6]; char num2[6]; printf("Enter your name: "); fgets(name, 50, stdin); printf("Enter an age: "); fgets(ageString, 10, stdin); // 第二个参数同步调整为缓冲区长度 printf("Enter num 1: "); fgets(num1, 6, stdin); printf("Enter num 2: "); fgets(num2, 6, stdin); // replace the trailing '\n' with '\0' name[strcspn(name, "\n")] = '\0'; ageString[strcspn(ageString, "\n")] = '\0'; num1[strcspn(num1, "\n")] = '\0'; num2[strcspn(num2, "\n")] = '\0'; printf("Your name is: %s, you are %s years old, num1: %s, num2: %s\n", name, ageString, num1, num2); return 0; }
方案2:手动清空输入缓冲区残留字符
如果有特殊要求不能修改缓冲区大小,可以在每次调用fgets后手动清空缓冲区残留内容,避免影响下一次读取,你可以新增一个清空缓冲区的工具函数:
void clear_stdin() { int c; while ((c = getchar()) != '\n' && c != EOF); }
每次调用fgets后判断读取到的内容中有没有换行符,如果没有就说明输入缓冲区还有残留,调用clear_stdin()清空即可,示例:
fgets(ageString, 3, stdin); if (strchr(ageString, '\n') == NULL) { clear_stdin(); }
内容的提问来源于stack exchange,提问作者what_a_bugg
相关产品推荐
相关产品推荐

