对fflush(stdin)功能以及实际应用的个人体会,对初学者应该挺有用

来源:互联网 发布:篡改或者伪造监测数据 编辑:程序博客网 时间:2024/05/28 04:54
 fflush(stdin)的功能是清空输入缓冲区,至于什么是输入缓冲区,在下面会有解释。
举个例子,“现在要求往一个整型数组里输入3个整数,并且输出指定序号对应的元素”。比如输入11,12,13,之后输出第2个元素,应该输出12。代码如下:
#include "iostream"
using namespace std;
int main()
{
int elem[20] = { 0 };//定义一个长度为20的整型数组,且其元素都为0
cout << "请输入3个元素,组成一个长度为3的简单顺序表" << endl;


for (int i = 0; i < 3; i++)//输入元素
cin >> elem[i];


cout << "请输入一个序号" << endl;
int m;
cin >> m;
cout << "序号" << m << "对应的元素是" << elem[m-1] << endl;
system("pause");
return 0;
}
下图是正常执行步骤,输入元素后 输出指定序号对应的元素。

然而有这么一种情况,输入的元素个数多于要求输入的个数,就会出错,如下图。

当我不仅仅输入11,12,13,而是多输入一个14的时候,程序就不再让我输入一个序号而是直接输出序号和元素,产生这个结果的原因就是输入缓冲区未清空。
我们的电脑的内存空间里有这么一部分叫作做输入缓冲区,当我们在键入数字或字符等元素时,这些元素会先存到输入缓冲区里,并不是直接放在内存上的。与输入缓冲区对应的还有输出缓冲区,统称为缓冲区,这里就不详细介绍,可自行百度。简单来说,缓冲区的作用是节省计算机的操作时间。
我们继续说输入缓冲区未清空导致的结果,我们输入11,12,13,14时,
for (int i = 0; i < 3; i++)//输入元素
cin >> elem[i];
这段代码只从输入缓冲区中取走了前3个元素11,12,13,所以14还留在输入缓冲区中。
那么,
cout << "请输入一个序号" << endl;
int m;
cin >> m;
中的cin>>m就会直接把输入缓冲区中的14赋给m,而不是让用户再输入
所以,既然m已经有14这个值了,程序就会按照这个数值执行后面的代码。
那么,fflush(stdin)的功能就可以应用到这里了,在
cout << "请输入一个序号" << endl;
int m;
cin >> m;
前面加上fflush(stdin);,清空一次输入缓冲区,即把14清除。
这样,就可以解决多输入的问题了。
修改后的完整代码如下:
#include "iostream"
      using namespace std;
      int main()
{
int elem[20] = { 0 };//定义一个长度为20的整型数组,且其元素都为0
cout << "请输入3个元素,组成一个长度为3的简单顺序表" << endl;


for (int i = 0; i < 3; i++)//输入元素
cin >> elem[i];
fflush(stdin);
cout << "请输入一个序号" << endl;
int m;
cin >> m;
cout << "序号" << m << "对应的元素是" << elem[m-1] << endl;
system("pause");
return 0;
}
修改之后的执行结果,如下图:

原创粉丝点击