使用scanf
允许跳过匹配的令牌,只需将*
添加到模式中,如:
int first, second;
scanf("%d %*s %d", &first, &second);
std::cin
是否有任何等效方法?像(当然,不使用其他变量)的东西:
int first, second;
std::cin >> first >> `std::skip` >> second;
答案 0 :(得分:3)
您可能正在寻找C++ String Toolkit Library。
选中此项以获取更多example
或者您可以尝试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;
答案 1 :(得分: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;
}
您可以扩展和改进上述代码,以实现您的需求。
答案 2 :(得分:2)
您可以简单地使用虚拟变量
int first, second;
std::string dummy;
cin >> first >> dummy >> second;
但是没有直接等效的AFAIK。