关于scanf与fgets配合使用时无法输入的C语言问题咨询
问题分析与解决:scanf后fgets跳过输入的问题
问题根源
当你用scanf("%lf", &nUm)输入数字并按下回车键时,**换行符(\n)**会残留在标准输入缓冲区中。后续调用fgets()时,它会直接读取到这个换行符,误认为已经完成输入,因此跳过了名字的输入环节。
解决方法
方法1:用getchar()清空缓冲区残留的换行符
在scanf之后调用getchar(),直接消耗掉缓冲区里的换行符:
#include <stdio.h> #include <stdlib.h> int main() { double nUm; char name[100]; printf("enter number \t:"); scanf("%lf", &nUm); getchar(); // 吃掉输入数字后遗留的换行符 printf("%f\n", nUm); printf("enter name \t:"); fgets(name, 100, stdin); printf("%s", name); return 0; }
方法2:通过scanf格式串处理换行符
修改scanf的格式控制符,用%*c读取并丢弃换行符(*表示读取但不存储):
#include <stdio.h> #include <stdlib.h> int main() { double nUm; char name[100]; printf("enter number \t:"); scanf("%lf%*c", &nUm); // %*c 自动吃掉换行符 printf("%f\n", nUm); printf("enter name \t:"); fgets(name, 100, stdin); printf("%s", name); return 0; }
如果输入数字后还输入了空格再回车,建议用循环清空缓冲区所有残留字符:
// 在scanf后添加这段代码 int c; while((c = getchar()) != '\n' && c != EOF);
方法3:统一用fgets读取输入,再转换为数字
避免混合使用scanf和fgets,先读取数字的字符串形式,再用atof()转换为double类型:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { double nUm; char num_str[100]; char name[100]; printf("enter number \t:"); fgets(num_str, 100, stdin); // 去掉字符串末尾的换行符 num_str[strcspn(num_str, "\n")] = '\0'; nUm = atof(num_str); printf("%f\n", nUm); printf("enter name \t:"); fgets(name, 100, stdin); printf("%s", name); return 0; }
内容的提问来源于stack exchange,提问作者eggsui
相关产品推荐
相关产品推荐

