C语言使用scanf后调用fgets读取浮点数组被跳过问题求解
问题原因
前面使用的scanf("%f")、scanf("%d")这类格式化输入函数,仅会读取匹配格式要求的数值内容,不会处理用户输入完成后按下回车键产生的换行符\n,这个换行符会一直残留在标准输入缓冲区中。
后续调用fgets()时,该函数的读取逻辑是遇到换行符就结束本次读取,因此会直接读取到残留的换行符,看起来就像直接跳过了输入环节。
修复方案
只需要在最后一次scanf调用之后、调用fgets之前,清空标准输入缓冲区中残留的换行符即可,常见实现方式如下:
方案1:循环读取残留字符直到换行(最稳妥)
在printf("enter array: ");之前加入如下代码:
// 清空输入缓冲区残留的换行及其他多余字符 int c; while ((c = getchar()) != '\n' && c != EOF);
这种方式可以处理用户输入数值时多敲的多余空格、字符等内容,兼容性最好。
方案2:在scanf格式串中处理换行
也可以直接修改最后一个scanf的格式串,主动吃掉后续的换行符,将原来的scanf("%d",&t);修改为:
scanf("%d%*c",&t);
其中%*c的作用是读取一个字符(也就是输入完t后的换行符)并且不赋值给任何变量,适合确认用户输入只会多一个换行的场景。
修复后完整代码示例
#include <stdio.h> int main() { float a, b; int t; printf("A: "); scanf("%f",&a); printf("B: "); scanf("%f",&b); printf("T: "); scanf("%d",&t); // 清空输入缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); printf("enter array: "); char str[100]; fgets(str, 100, stdin); printf("%s", str); return 0; }
内容的提问来源于stack exchange,提问作者jl123
相关产品推荐
相关产品推荐

