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;
}
:
は、この私の素朴なコードを試してみてください。
+1妥当な音です! 'std :: ios :: skip :: str'、' std :: ios :: skip :: dec'、 'std :: ios :: skip :: any'のような一連のスキップ? (: – Rubens
@Rubens:私の更新された答え、第2部を参照してください。 – deepmax
'std :: ctype :: scan_is'はこれをしませんか? – 0x499602D2