ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在C语言中使用fflush(stdin)

2021-07-03 18:01:29  阅读:259  来源: 互联网

标签:scanf stdin C语言 str fflush geeks 输入


    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 string
		fflush(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.

标签:scanf,stdin,C语言,str,fflush,geeks,输入
来源: https://blog.csdn.net/zsx0728/article/details/118439314

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有