使用std :: cin忽略/跳过令牌

Rub*_*ens 6 c++ skip scanf cin

scanf一个被允许跳过匹配令牌,简单地添加*到图案,如下所示:

int first, second;
scanf("%d %*s %d", &first, &second);
Run Code Online (Sandbox Code Playgroud)

有没有相同的方法std::cin?像(当然,节省额外变量的使用):

int first, second;
std::cin >> first >> `std::skip` >> second;
Run Code Online (Sandbox Code Playgroud)

mas*_*oud 3

对于 C++ 中的输入流来说,做同样的事情并不是一个简单的任务。函数scanf获取所有预期的格式:"%d %*s %d"并且可以向前确定发生了什么。

另一方面,操作员>>只是尝试满足当前的输入参数。


您有机会编写自己的 istream 操纵器来吃掉输入,直到达到数字。

试试我的天真的代码:

template<typename C, typename T>
basic_istream<C, T>&
eat_until_digit(basic_istream<C, T>& in)
{
  const ctype<C>& ct = use_facet <ctype<C>> (in.getloc());

  basic_streambuf<C, T>* sb = in.rdbuf();

  int c = sb->sgetc();
  while (c != T::eof() && !ct.is(ctype_base::digit, c))
      c = sb->snextc();

  if (c == T::eof())
      in.setstate(ios_base::eofbit);

  return in;
}

int main()
{
    int first, second;

    cin >> first >> eat_until_digit >> second;

    cout << first << " : " << second << endl;
}
Run Code Online (Sandbox Code Playgroud)

您可以扩展和改进上述代码来实现您的需要。