cpp►cin.ignore()函数——缓冲区

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp►cin.ignore()函数——缓冲区相关的知识,希望对你有一定的参考价值。

cin.sync()的功能是清空缓冲区,而cin.ignore()虽然也是删除缓冲区中数据的作用,但其对缓冲区中的删除数据控制的较精确。

有时候你只想取缓冲区的一部分,而舍弃另一部分,这时就可以使用cin.ignore(),其定义如下:

istream& ignore(streamsize n = 1, int delim = EOF);

其中n是一个整型表达式,也可以是一个整型数值,这个数值表示在一行中忽略的字符的最大数目,比如说n=100;还有一个参数delim,是一个字符表达式。表示如果遇到一个字符值等于delim,那么就停止ignore(),如果ignore100个字符之后还没遇到值等于delim的字符,那也得停止ignore(),所以100是ignore()所忽略的最大字符数。

例子一:

// istream::ignore example
#include <iostream>
using namespace std;
int main() {
	char first, last;
	cout << "Please, enter your first name followed by your surname: ";
	first = cin.get();// get one character
	cin.ignore(256, ' ');// ignore until space
	last = cin.get();// get one character
	cout << "Your initials are:" << first << last << '\\n';
	return 0;
}
Please, enter your first name followed by your surname: |John Smith<Enter>
Your initials are:JS

cin.get();获取到键盘输入一串字符中的第一个字符,其余字符都在缓冲区,如果没有cin.ignore(256, ' '); 第二次cin.get();直接从缓冲区读取一个字符,没有用户键盘输入的机会。ignore函数作用即是检查cin缓冲区的最多256个字符,如果中途发现了空字符’ ‘,就停止;或者到达结尾;或者检查到达第256个字符,也停止。
用户键盘输入:John Smith,first = ‘J’,缓冲区内容为"ohn Smith\\n",< Enter>键对应的’\\n’也被缓冲。这里ignore函数在检查256个字符前找到了空字符’ ',igonre函数终止,这时缓冲区中被ignore的字符有"ohn ",然后就last=‘S’。

例子二:

#include<iostream>
int main() {
	int ival1 = 0, ival2 = 0;
	std::cin >> ival1;
	//std::cin.ignore(100, '\\n');
	std::cin >> ival2;
	std::cout << "ival1 = " << ival1 << std::endl;
	std::cout << "ival2 = " << ival2 << std::endl;
	return 0;
}
|11 22 33 44<Enter>
ival1 = 11
ival2 = 22

只一次< Enter>,就输出结果了,没有第二次键盘输入的机会。
解注释ignore函数,让它起效果,运行结果如下:

|11 22 33 44<Enter>
|55 66 77 88<Enter>
ival1 = 11
ival2 = 55

当输入"11 22 33 44\\n"后,ival1变量存储了以空格为分隔符的第一个整数11,余下的" 22 33 44\\n"在缓冲区,cin.ignore(100, ‘\\n’); 在检查到’\\n’时停止,此时还没有检查到100个字符,所以相当于第一次键盘输入之后留在缓冲区的字符都被清除了。由于这时没有缓冲区字符了,所以才有第二次从键盘输入的机会。

注意:ignore()是操作缓冲区的,比如cin >> ch; 读取到一个字符后,余下的才是要操作的缓冲区,而不是从键盘输入的所有字符开始检查!
比如:cin >> data; 键盘输入123< Enter>,这时123已经不在缓冲区了,就剩下< Enter>对应的’\\n’了。所以接下来cin.ignore();<=>cin.ignore(1, EOF); 的作用就是从缓冲区中去除末尾的换行符。

以上是关于cpp►cin.ignore()函数——缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

清空缓存区,避免对缓存区中残留数据对下次读入造成影响

vs2019清空输入缓冲区

cin.clear() 和 cin.ignore() 不起作用[关闭]

C++ 中的 Getline 和 cin.ignore

C标准输入流

何时以及为啥需要在 C++ 中使用 cin.ignore()?