关于cin.ignore()用法的一些浅见

        最近遇到一个之前没有见过的函数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()函数的作用便很明显的体现出来了。

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值