fflush() 通常仅用于输出流。它的目的是清除(或刷新)输出buffer,并将缓冲的数据移动到控制台(在stdout的情况下)或磁盘(在文件输出流的情况下)。下面是它的语法。

fflush(FILE *ostream);
ostream 指向一个输出流或一个更新流,其中最近的操作不是输入。fflush函数会导致将该流的任何未写入数据传递到主机环境,并写入该文件;否则,行为未定义。
我们可以将它用于像 stdin 这样的输入流吗?

    根据 C 标准,使用 fflush(stdin) 是未定义的行为。然而,一些编译器如 Microsoft Visual Studio 允许它。在这些编译器中如何使用它? 在获取带空格的输入字符串时,缓冲区不会为下一个输入清除,而是将前一个视为相同输入。为了解决这个问题,使用 fflush(stdin) 清除流/缓冲区。

// C program to illustrate situation
// where flush(stdin) is required only
// in certain compilers.
#include <stdio.h>
#include <stdlib.h>
int main()
{char str[20];int i;for (i=0; i<2; i++){scanf("%[^\n]s", str);printf("%s\n", str);// fflush(stdin);}return 0;
}

    输入:

geeks
geeksforgeeks

    输出:

geeks
geeks

    上面的代码只接受一个输入,并为第二个输入提供相同的结果。原因是因为字符串已经存储在缓冲区中,即流尚未清除,因为它希望字符串带有空格或新行。因此,使用 fflush(stdin) 来处理这种情况。

// C program to illustrate flush(stdin)
// This program works as expected only
// in certain compilers like Microsoft
// visual studio.
#include <stdio.h>
#include <stdlib.h>
int main()
{char str[20];int i;for (i = 0; i<2; i++){scanf("%[^\n]s", str);printf("%s\n", str);// used to clear the buffer// and accept the next stringfflush(stdin);}return 0;
}

    输入:

geeks
geeksforgeeks

    输出:

geeks
geeksforgeeks

    说明:
    scanf("%[^\n]s", str); 等价于 gets(str);
    %[^\n] 可读取带有空格的字符串,以换行符结尾。具体可参考 scanf(“%[^\n]s”, str) Vs gets(str)。

使用fflush(stdin)好吗?

    虽然在“scanf()”语句之后使用“fflush(stdin)”也会清除某些编译器中的输入缓冲区,但不建议使用它,因为这是语言标准未定义的行为。在C和C++中,我们有不同的方法来清除在这个帖子中讨论的缓冲区。

参考文档

[1]Sahil Chhabra.Use of fflush(stdin) in C[EB/OL].https://www.geeksforgeeks.org/use-fflushstdin-c/,2018-12-13.

在C语言中使用fflush(stdin)相关推荐

  1. c语言中标准输入文件 stdin 是指,C语言中,认为键盘是标准输入文件stdin

    不红旗",语言中牌的国制工匠造中造世界品精神了打体现. 年度个人管理总额结汇业务实行,为键文件年等值(即每人每. 指对账的原则,标准不相应予符的反映,果的真实信息会计核算和业必须务处对账结果 ...

  2. c语言中fflushstdin作用,C语言fflush(stdin)函数是什么意思,在什么情况下用它

    C语言fflush(stdin)函数是什么意思,在什么情况下用它 來源:互聯網  2009-04-22 18:49:31  評論 分類: 電腦/網絡 >> 程序設計 >> 其他 ...

  3. fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用

    理解:fflush(stdin)和fflush(stdout)和rewind(stdin) 小结论(多谢网友zhao4zhong1为我解答疑难): 1.在每个最后不带\n的printf后面加fflus ...

  4. c语言怎么清空标准输入缓冲区,C语言中如何清空输入输出缓冲区

    C语言中如何清空输入输出缓冲区 答案:5  信息版本:手机版 解决时间 2019-10-06 09:40 已解决 2019-10-05 13:54 C语言中如何清空输入输出缓冲区 最佳答案 2019- ...

  5. 为什么fflush(stdin)用了并不能清除缓冲区

    为什么fflush(stdin)用了并不能清除缓冲区 很多人在教材上都看到fflush(stdin)这个函数的使用,教材给出的解释是清除缓冲区,可是一些动手实践过代码的小伙伴发现,fflush(std ...

  6. C语言中几个字符串输出

    printf 功能 c语言中产生格式化输出的函数(定义在 stdio.h 中).向终端输出(显示器等) 用法 int printf(const char *format,[argument]); fo ...

  7. c语言怎么同时输入两个字符,解决C语言中使用scanf连续输入两个字符类型的问题...

    昨天用C编程,遇到一个关于scanf的细节问题,假如运行如下程序: #include int main() { char ch1,ch2; printf("Input for ch1:/n& ...

  8. C/C++ 误区:fflush(stdin)

    C/C++ 误区:fflush(stdin) 注:本文转自http://blog.chinaunix.net/u/32196/showart.php?id=250809 并非原创,收入本博,聊作记录. ...

  9. C语言中的输入输出函数

    ----------------------------- //键盘缓存区(按enter送入)==>输入缓存区 ==>scanf ----------------------------- ...

  10. IOS笔记-C语言中的指针与数组

    1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型  *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p =  ...

最新文章

  1. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)
  2. element ui 图片控件 排序_Element-ui上传图片后隐藏上存控件
  3. 摄像头uid怎么获取_每秒30W次的点赞业务,怎么优化?
  4. 【机器学习】机器学习从零到掌握之十 -- 教你使用Python实现决策树
  5. 自动网络搜索(NAS)的理解
  6. 数据库联结使用及分类
  7. iview tooltip自动消失_实现自动驾驶,为什么要对汽车、行人的轨迹进行预测?它与物体检测、追踪和路径规划间的关系是什么?...
  8. flush table mysql_MySQL flush table 导致的锁问题
  9. Jensen不等式及其扩展
  10. 亦是美网络,致力于操作系统应用与计算机网络技术的IT网站。
  11. 复化科特斯公式matlab_基于牛顿—科特斯积分的误差分析
  12. CentOS7--安装谷歌浏览器--详细步骤
  13. oracle后台进程介绍,Oracle后台进程介绍
  14. 恒生UFX交易接口基本介绍说明
  15. 高中数学培训高一数学提分技巧
  16. 怎么检测声音频率和幅值_作者特稿铝板塑性损伤的电磁超声非线性检测新方法...
  17. 【c++】计算句子中单词的平均长度
  18. criteo 点击率预估_预处理criteo数据集以预测广告的点击率
  19. 微信公众号怎么发PDF?
  20. mysql 触发器 修改记录_mysql触发器

热门文章

  1. 电子科技大学计算机专业考什么,2015年电子科技大学081203计算机应用技术考研专业目录及考试科目...
  2. SDI科普--- SD-SDI/HD-SDI/3G-SDI/12G-SDI
  3. 四川山海蓝图抖音播放量
  4. 优秀的java程序员怎么写注释的
  5. icd11中文版精神障碍pdf_简明国际神经精神障碍访谈检查(MINI)中文版.pdf
  6. j2ee课程设计—基于activiti的请休假系统
  7. 定时器的ETR有何功能?
  8. JavaScript 中 List转Tree,Tree转List
  9. choco安装[win10包管理器]
  10. docker exec详解