2017-06-02 9 views
-3

私はC++をかなり新しくしています。実際に何が起こっているのか分かりません。boost split - coutとvector - これの動作を説明してください

だから私はユーザーから入力を得るためにcinを使用しています。次に、その文字列をベクトルに分割し、ベクトルの最初のインデックスを印刷しようとしています。

マイコード:

int Console::print(std::string message, int color) 
{ 
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(consoleHandle, brightGreen); 
    std::cout << "myconsole :: "; 
    SetConsoleTextAttribute(consoleHandle, color); 
    std::cout << message << "\n"; 
    return 0; 
} 

何が起こっている:

この質問のために、ここではそのためのコードは私のコンソール印刷機能は普通のCOUTを使用しています

std::string cmd; 
std::vector<std::string> args; 

while (std::cin >> cmd) { 
    boost::split(args, cmd, boost::is_any_of(" "), boost::token_compress_on); 

    Console::print(args[0]); 
    break; 
    //reset the vector 
    //std::cin.clear(); 
    //args.clear(); 
} 

です入力は「開始」です。

最初の要素を印刷したいだけです。ブレークせずに、私のプログラムは最初にプリントを開始し、それからプリントアウトします。私はプログラムが2つのループを行い、毎回最初の要素を出力すると判断しました。なぜなら、ブレークがあると印刷が始まり、プログラムが終了するからです。まず、なぜこれが起こっているのですか?なぜ、ベクトルの最初のインデックスが削除されてループされ、最初のインデックスが "go"になりますか?

これは、すべてストリングストリーム/バッファまたは何かと関係がありますか?私はこれらについてあまり知らない。これは私の推測でしたので、バッファをcin.clear()でリセットし、args.clear()でベクトルを空にしましたが、それでも同じ結果が得られました。

次のコードを使用して2番目の要素「go」にアクセスしようとすると、プログラムがクラッシュするだけです。上記から試したことから、私は正しく文字列を分割していると仮定することができます。

非同期動作が発生していますが、分割機能はまだ完了していませんか?または?

ご協力いただければ幸いです。ありがとう。

答えて

1

std::cin >> cmdは、「開始」だけを読み込み、ループにフィードして(単一の要素ベクトルを作成して唯一の要素を印刷します)、丸めてループし、同じことを「実行」で行います。

while(std::getline(std::cin, cmd))が必要です。

また、問題の内容を示したデバッガを使用する方法も学ぶ必要があります。

+0

ありがとう私はそれに取り組んでいます:P シン>> cmdの行だけが最初のスペースに読み取りますか? – user3238415

+0

文字列を読み込むと空白(空白、タブ、行末)がスキップされ、最初の空白やEOFまで読み込まれます。 –

関連する問題