2013-09-28 6 views
6

は、単にパターンに*を追加し、マッチしたトークンをスキップに許可されているCIN、のように:/STDを使用してトークンを飛ばし:: <code>scanf</code> 1で

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

std::cinと任意の等価なアプローチがありますか? (もちろん、追加の変数の使用を温存)のような何か:

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

答えて

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; 
} 

は、この私の素朴なコードを試してみてください。

+0

+1妥当な音です! 'std :: ios :: skip :: str'、' std :: ios :: skip :: dec'、 'std :: ios :: skip :: any'のような一連のスキップ? (: – Rubens

+1

@Rubens:私の更新された答え、第2部を参照してください。 – deepmax

+0

'std :: ctype :: scan_is'はこれをしませんか? – 0x499602D2

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; 
+0

stlの唯一のオプションですが、私は少しきれいなものを期待していました。 'std :: ios :: skip :: str'と' std :: ios :: skip :: dec'と 'std :: ios :: skip :: any'さえ非常にいいでしょう:( – Rubens

+0

@Rubens: - それは今役立つのですか? –

+1

+1あなたの投稿が役に立たなかったことを決して意味しませんでした!^^機能例をありがとう!(: – Rubens

2

あなたは、単にダミー変数

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

を使用することができますが、直接対応私の知る限りではありません。

+0

はい、 *もちろん、追加のvarsの使用を惜しまない* "私はこれが唯一の解決策であるという考えに慣れています。とにかく\ = – Rubens

+0

@Rubens、申し訳ありませんがそれを逃しました – john

関連する問題