C++ STL输入功能


cin.clear()cin.sync()

cin.clear() 用来更改cin的状态标示符

cin.sync() 用来清除缓存区的数据流

如果标示符没有改变那么即使清除了数据流也无法输入,所以两个要联合起来使用

cin.ignore(a,ch)

输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。

它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

std::cin.ignore(numeric_limits<streamsize>::max(), '\n');

示例代码:

#include<iostream>
#include<vector>

using namespace std;

int main()
{
   int x;
   char str[80];
   cout << "Enter a number and a string:\n";
   cin >> x;
   cin.getline(str,80); //take a string
   cout << "You have entered:\n";
   cout << x << endl;
   cout << str << endl;
   return 0;
}

输入

8
hahaha

输出

Enter a number and a string:
8
You have entered:
8

整数和字符串有两个cin语句,但只取数字。当我们按下回车键时,它会跳过 getline() 函数而不接受任何输入。有时它可以接受输入但在整数变量的缓冲区内,所以我们看不到字符串输出。

现在为了解决这个问题,我们将使用 cin.ignore() 函数。

cin.sync()cin.ignor()的比较

sync()的作用就是清除输入缓冲区。成功时返回0,失败时badbit会置位,函数返回-1. 另外,对于绑定了输出的输入流,调用sync(),还会刷新输出缓冲区。

但由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用sync()。可以考虑用ignore函数代替。

cin.ignore(numeric_limits<std::streamsize>::max(),' /n'); //清除当前行
cin.ignore(numeric_limits<std::streamsize>::max());       //清除cin里所有内容

不要被长长的名字吓倒,numeric_limits\<std::streamsize\>::max()不过是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

使用ignore显然能比sync()更精确控制缓冲区。


文章作者: sfc9982
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 sfc9982 !
  目录