2.C++之cin(三)——关于cin.sync

C++ 关于大多数人将 cin::sync() 视为清除缓存区函数的错误

百度cin::sync(),得到的绝大多数解释都是用作清除缓冲区,并声明一般与cin::clear()函数一起用达到目的。同样百度清除缓冲区的方法,也是绝大多数说用cin::sync()达到此目的。然而cin::sync()却并非是用作清除缓冲区的,所以这样用有时候不能达到我们想要的清空缓冲流的效果。

对于cin::sync,作用根据上述C++文档说明,应该为: Synchronize input buffer ,也就是 同步输入缓冲流
注意到该网页中的例子:

// syncing input stream
#include <iostream>     // std::cin, std::cout

int main () {
  char first, second;

  std::cout << "Please, enter a word: ";
  first = std::cin.get();
  std::cin.sync();

  std::cout << "Please, enter another word: ";
  second = std::cin.get();

  std::cout << "The first word began by " << first << ‘\n‘;
  std::cout << "The second word began by " << second << ‘\n‘;

  return 0;
}

Possible output:

Please, enter a word: test
Please enter another word: text
The first word began by t
The second word began by t

Realistic output:

Please, enter a word: text
Please, enter another word: The first word began by t
The second word began by e

为什么会这样呢?注意该网页中对此例子的结果前提: Possible output
好了,现在来好好解释下cin::sync()到底是做什么的。
为什么有时候能用来作为清空输入缓冲流的作用,但是这种做法有时候却不管用了。
首先,我们从键盘输入了text,按下回车,text进入输入缓冲流(包括回车),然后取一个字符‘t’赋给first,并从缓冲流中删除‘t’,然后进入了关键的cin::sync();
此时数据源的内容为:text(VS2017下);缓冲区的内容为:ext
通过cin::sync();同步数据源与缓冲区的内容,缓冲区的内容又变为了text
此时的流的定位位置为e,所以再次从缓冲区取内容时,是取的e而不是t

为什么在例如Devc++的编译器下,用cin::sync()就能清除缓冲区内容呢?
因为在Devc++下,数据源在把数据给缓冲区后,就清空了数据源的内容,所以在cin::sync()的同步下,缓冲区也被清空了,所以就形成了缓冲区被清空的情况
cin再次取数据时,缓冲区为空,所以又要进行从键盘(数据源)键入,然后传给缓冲区的步骤,在此步骤下,流的定位位置也被“刷新”了,所以不会出现输出e,而是输出t
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值