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
相关产品推荐
相关产品推荐

