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()函数——缓冲区的主要内容,如果未能解决你的问题,请参考以下文章