2012-01-14 31 views
3

すべての人。私は経験豊富なCプログラマで、C++に調整しようとしています。私はこのCステートメントの同等物をしたいと思います...C++の文字列内の文字列を検索します

sscanf(str, "%s %s", sub1, sub2); 

...しかし、C++の文字列オブジェクトです。 strが "hello world"だと言って、上のsscanfステートメントを実行すると、 "hello"がsub1に、 "world"がsub2に置かれます。私はC++のようなC関数を使うことができますが、文字配列の代わりにC++の文字列オブジェクトを使いたいと思います。

string q, h, w; 
cout << "Type \"hello world\": "; 
cin >> q; 
istringstream x(q); 
x >> h >> w; 
if (h == "hello") 
    cout << "Yes!\n"; 
else 
    cout << "No!\n"; 
if (w == "world") 
    cout << "Yes!\n"; 
else 
    cout << "No!\n"; 

をしかし、それは出力「はいいいえ!」、を意味し、それは「こんにちは」ではなく「世界」を拾った:私はこれを試してみました。何か案は?

答えて

3

cinで使用されるoperator>>は「hello」フレーズをキャプチャし、最初の区切り文字(この場合はスペース)で停止するためです。ユーザーが入力した最初の行区切り文字まで入力行全体をキャプチャする場合は、getline(cin, q)を使用する必要があります。 getline()という2つの引数を持つバージョンでは、改行文字が区切り文字として使用されますが、カスタムの行区切り文字も指定できる3つの引数バージョンがあります。

+2

ストリーム操作をエラーチェックした場合は、すでにストリーム操作が検出されています。 –

3

エラーチェックを行わずにiostreamを使用しないでください。ジェイソンが言うように、行全体だけでなく、1つのトークンを読んで、それでもエラーをチェックします:

std::string line; 

if (std::getline(std::cin, line)) 
{ 
    std::string h, w; 
    std::istringstream iss(line); 

    if (iss >> h >> w) 
    { 
     // success 
    } 
    else 
    { 
     std::cerr << "Error reading your input.\n"; 
    } 
} 
else 
{ 
    std::cerr << "Error reading from stdin!\n"; 
} 

あなたが読書を維持したい場合は、ループにif Sを作ることができます。

結果がテスト可能なものに変換され、操作が失敗した場合の条件はfalseになりますので、基本的に、あなたは、条件として、すべてのフォーマットされた抽出(getline>>)を確認することができます。したがって、操作が成功した場合を除いて、受け取り先の変数を決して解釈する必要はありません。

このチェックをコードx >> h >> w;に追加した場合は、決してその行を過ぎたことはありません。

関連する問題