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

fgets无法正常接收输入,求正确使用方法及问题排查

解决fgets跳过输入的问题

fgets跳过输入几乎都是输入缓冲区残留换行符导致的——比如你之前用scanf、getchar这类函数读数据时,用户输入完按下的回车(换行符\n)会留在缓冲区里,后续调用fgets时会直接读取这个换行符,表现为“跳过输入”。

以下是几种直接有效的解决方法:

方法1:手动清空输入缓冲区

在调用fgets之前,用循环把缓冲区里的所有残留字符(包括换行)读完:

// 假设之前有scanf之类的输入操作
int id;
scanf("%d", &id);

// 清空缓冲区
int c;
while ((c = getchar()) != '\n' && c != EOF);

// 现在调用fgets就不会被跳过了
char publisher[81]; // 要存80个字符,数组长度设81(留位置给终止符)
fgets(publisher, sizeof(publisher), stdin);

方法2:全程用fgets读取输入,再做格式转换

如果你的程序里混合用scanf和fgets容易出问题,不如统一用fgets读取所有输入,再用sscanf转换为需要的数值类型:

char input_buf[100];
int id;

// 先读id的输入
fgets(input_buf, sizeof(input_buf), stdin);
sscanf(input_buf, "%d", &id);

// 再读publisher,不会被跳过
char publisher[81];
fgets(publisher, sizeof(publisher), stdin);

方法3:处理fgets读入的换行符

fgets会把用户输入的换行符也读进字符串里,如果不需要这个换行符,可以手动替换为终止符:

char publisher[81];
if (fgets(publisher, sizeof(publisher), stdin) != NULL) {
    // 找到换行符的位置并替换
    publisher[strcspn(publisher, "\n")] = '\0';
}

注意点

  • 定义字符串数组时,长度要设为81(因为fgets会自动添加字符串终止符\0,80个字符+1个终止符)。
  • 始终检查fgets的返回值,避免读取失败(比如输入流被关闭)的情况。

内容的提问来源于stack exchange,提问作者saquibansari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:12:43