2012-03-09 16 views
1

私は空白で区切られた小さな文字列に入力文字列を分割しようとしていました。 hereからC++ Stringstream:文字列を受け入れますが、変数に格納された文字列は受け入れません。どうして?

stringstream ss ("bla bla"); 
string s; 

while (getline(ss, s, ' ')) { 
cout << s << endl; 
} 

のコードが見つかりました。しかし、私は、文字列を含む変数と「BLA BLA」を交換する場合:

string userInput; 
cin >> userInput; 

stringstream ss (userInput); 
string s; 

while (getline(ss, s, ' ')) { 
cout << s << endl; 
} 

のみ最初の単語/文字/文字列のプリントを行います。何故ですか?それを修正する方法はありますか?私は文字列ストリームのいくつかの質問を見回しましたが、問題は私が探しているものが本当にわからないことです。

#include "stdafx.h" 
#include <string> 
#include <sstream> 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::string test("bla bla"); 
    std::stringstream stream(test); 
    std::string temp; 
    while (getline(stream, temp, ' ')) { 
     std::cout << temp << std::endl; 
    } 
    return 0; 
} 

それはあなたがやったとでも何である:

+4

「という文字列を含む変数」の一例を示し、それに 'stringstream'を初期化してください。 – Xeo

+0

私のためにうまく動作します。 –

+0

私によく見える:http://ideone.com/1AvVV。 –

答えて

8

問題はstringstream ss (userInput);ではありません。それはstd::cinです。すべての空白がフォーマットされたユーザー入力の抽出を終了するので、入力bla blaのいずれかになります。std::string s = "bla"と他の文字列"bla"が抽出を待っています。

代わりに cin >> noskipws >> userInput;を使用してください。 回線を取得する場合は、代わりにstd::getline(std::cin,userInput)を使用してください。この小さなdemonstrationを見て、あなたの入力bla blastd::cin::operator>>std::getlineを比較する:

出典:

#include <iostream> 
#include <string> 

int main(){ 
     std::string userInput; 

     std::cout << "Using std::getline(std::cin,userInput) on input \"bla bla\"." << std::endl; 
     std::getline(std::cin,userInput); 
     std::cout << "userInput contains \"" << userInput << "\"" << std::endl; 

     std::cout << "std::cin >> userInput on input \"bla bla\"." << std::endl; 
     std::cin >> userInput; 
     std::cout << "userInput contains \"" << userInput << "\"" << std::endl; 
     return 0; 
} 

結果:

Using std::getline(std::cin,userInput) on input "bla bla". 
userInput contains "bla bla" 
std::cin >> userInput on input "bla bla". 
userInput contains "bla"

も参照してください:

+0

あなたは先生/マダム、神様です。どうもありがとうございます。 – user1258934

+0

@ user1258934 AAAhhhh私は "bla bla"ではなく "blabla"でテストしていたので、それがうまくいったのです。 +1 –

+0

@ user1258934:動作を説明したが、鈍い解決策を提示したので、私は自分の答えを更新した。私は、 'std :: noskipws'と言いますか?私はコーヒーなしで質問に答えるべきではありません:D ...しかし、あなたはすでに残りの部分( 'std :: getline')を自分で解決したと思います。 – Zeta

0

これは、あなたが言ったことありません。しかし、それは動作する - あなたのコードとの違いはどこですか?

と便利なのMicrosoft Visual C++コンパイラを持っていないとの違いを理解していない人のために、ここにコードスニペットがあります:

std::string test("bla bla"); 
std::stringstream stream(test); 
std::string temp; 
while (getline(stream, temp, ' ')) { 
    std::cout << temp << std::endl; 
} 

そのスニペットで必要とされるが含まは以下のとおりです。<string><sstream> & <iostream>。必要な方法で挿入してください。

+3

スタックオーバーフローでは、Microsoft C++( 'stdafx.h'、' _tmain'、 '_TCHAR')ではなく標準のC++を提示する方が良いです... –

+0

@Chalesworth:問題のコードに変更が必要な場合別のコンパイラで実行することもできますが、この場合は実行しません(ポストの変更を参照)。コンパイルしてテストしたサンプルを投稿したかったのです。 –

関連する問題