6

使用scanfone 可以跳过匹配的标记,只需添加*到模式中,如下所示:

int first, second;
scanf("%d %*s %d", &first, &second);

有没有等效的方法std::cin?类似的东西(当然,不使用其他变量):

int first, second;
std::cin >> first >> `std::skip` >> second;
4

3 回答 3

3

您可能正在寻找C++ String Toolkit Library

检查此以获取更多示例

或者你可以试试ignore这样的功能:

std::cin >> val1;
std::cin.ignore (1234, ' ');
std::cin >> val3;

像这样的东西: -

template <class charT, class traits>
inline std::basic_istream<charT, traits> &
ignoreToken (std::basic_istream<charT, traits> &strm)
{
    strm.ignore (1234, ' ');
    return strm;
}

然后像这样使用:

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5;
于 2013-09-28T15:24:14.807 回答
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;
}

你可以扩展和改进上面的代码来实现你所需要的。

于 2013-09-28T15:36:11.450 回答
2

您可以简单地使用虚拟变量

int first, second;
std::string dummy;
cin >> first >> dummy >> second;

但没有直接等效的 AFAIK。

于 2013-09-28T15:29:44.617 回答