C语言 scanf 缓冲区 行缓冲 fflush

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int a, b, c, age;
    float scores;
    scanf("a=%d,b=%d,c=%d", &a, &b, &c);
    printf("a+b+c=%d\n\n", (a + b + c));
    fflush(stdin);  // 清空缓冲区
    scanf("age %d score %f.", &age, &scores);
    printf("age=%d, scores=%f.\n", age, scores);
    system("pause");
    return 0;
}

image.png

问题1:输入a=1,b=2,c=3之后,程序运行完了,不会有第二次输入?,但是明明已经fflush(stdin)了。如果注释fflush,也是一样的效果。

问题2:scanf不是行缓冲吗,行缓冲遇到回车时,不是会自动刷新缓冲区的吗,那么不需要fflush应该也可以进行第二次输入的吧?

阅读 2.8k
1 个回答

修改如下,第一个字符为换行

    // fflush(stdin); 不需要
    scanf("\nage %d score %f.", &age, &scores);

scanf并不读取最后的换行符号,这个换行符号是下次scanf调用的第一个字符。

    scanf("age %d score %f.", &age, &scores);

上述写法导致scanf在读取到换行后匹配不成功时立即返回,换行和a不匹配。

采用连续输入多个数字用空格分隔,用回车结束,scanf函数会忽略空白字符,不会出现上述问题,代码如下

    scanf("%d %d %d", &a, &b, &c);
    scanf("%d %f", &age, &scores);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏