最近遇到一个之前没有见过的函数ignore(),经过一番查阅和自己的亲手测试之后,我得出了一些比较浅显但是可能有用的结论,希望能够给大家带来帮助。同时,也是一次抛砖引玉,希望有高人可以对此提出更深层次原理的指教。
1.ignore(int i,char c )函数用法:
代码如下:
运行并输入tt" 空格"lm,结果如下:
注意,我们仅进行了一次输入,当输入tt"空格"lm这5个字符后回车,字符‘t’便赋给了变量a,此时字符流缓冲区还有t、“空格”、l、m这4个字符。这时候我们的cin.ignore(3,'m')发生了调用,开始从字符流缓冲区里进行遍历,当读取到m这个字符时,函数便停止遍历,并从字符流中依次删除t、“空格”、l 这三个字符。此时字符流里仅剩下m和'\n'(换行符),于是无需我们再次输入,cin>>b自动发生,变量b被赋予m这个仅剩的字符。如果我们把ignore(3,'m')中的3改为2,则运行结果如下:
很显然,当读取到字符m时,函数删除了t,"空格"这两个字符,字符流中还剩下l、m和'\n',于是b被赋予第一个字符l,此时字符流中还有m和'\n',如果此时再增加一个char型变量c,并对其使用cin>>c这一语句,则变量c将被赋予m这一字符。
如果在此基础上再创建一个变量d,并在return语句前加上cin>>d这一语句,然后重复前面的输入,则运行结果如下:
可见并没有像之前那样直接打印出a、b、c、d的值,而是需要继续进行输入,于是我们再次输入一个字符w,运行结果如下:
这是由于在进行完变量a、b、c的赋值后,字符流缓冲区仅剩下一个'\n',而该字符是不能用来赋值的,于是cin>>d这一语句的进行需要用户再次进行手动输入,给字符流缓冲区添加一些新的字符以便进行下一步的变量赋值操作,当我们输入w后,w被赋给了变量d,于是最终d被打印出来的值便是w。
2.ignore(int t)函数用法
代码以及运行结果如下:
很显然,string型变量a的值本应该是"qwer",由于函数cin.ignore(3)的调用,从q开始的三个字符从字符流里被删除,仅剩下的"rt"便被赋值给了变量a。
此外,需要特别指出的是,'\n'(即回车)也被视为字符流中的字符,这就意味这如果我们像下图样输入的话(即1、2、回车、4),字符1、2、回车将被删除,而字符流中仅剩的可以赋值给变量的字符(即除'\n'以外的字符)便是4了,4将被赋予给变量a。
如果我们输入很多个回车的话,直到我们输入一个可以赋值的字符之前,cout<<a这一语句将一直无法进行,因为'\n'无法被赋值给a,演示如下:
这里我们可以看作cin.ignore(3)从字符流中删除了三个'\n'后,剩下的好几个'\n'由于无法赋值给a,便直接被a忽略,一直到字符5时a才开始被字符流赋值,最终结果就是三个连续的字符5pp了。
3.ignore()函数用法:
有了对以上两种形式的ignore函数用法的了解以后,我们可以很自然的理解ignore()的用法了。我们可以把该函数看作ignore(1,'\n'),即删除字符流中回车键以前的第一个字符。当我们运行以下代码时:
int main()
{
string a,b;
cout<<"请输入a的值: "<<endl;
cin>>a;
// cin.ignore();
getline(cin,b);
cout<<"a的值为: "<<a<<endl;
cout<<"b的值为: "<<b<<endl;
return 0;
}
运行结果如下:
当我们将cin.ignore()的注释解除掉,使其能够被编译,运行结果如下:
可以看到cin.ignore()的作用下,456前的空格在字符流中被删除,变量b被赋予456这一字符串,两相对比,ignore()函数的作用便很明显的体现出来了。