1

私の問題は、次のように文字列を定義したことです。

string messages = "This is an option; This is a really long option; Another One For Testing Sake; This is the last one I swear; You lied to me!";

「;」文字列内の文字は区切り記号のように扱われます。物事の壮大なスキームでは、この文字列は関数に呼び出されますres.addMessages(messages);。そのコードは次のとおりです。

void ConflictResMenu::addMessages(string messages) {

    int idx = 0;
    for (int i = 0; i < messages.length(); i++) {

        cout << messages.find_first_of(';') << endl;
        if (messages[i] == this->delim) {

            this->split_messages.push_back(messages.substr(idx, i));
            idx = i + 1;

        }
    }
}

これに関する問題は、if 句が間違ったタイミングで呼び出されるため、出力が次のようになることです。

This is an option
This is a really long option; Another One For
Another One For Testing Sake; This is the last one I swear; You lied to me!
This is the last one I swear; You lied to me!

正直なところ、ここで何が起こっているのかわかりません。誰かがこれに近づくためのより良い方法を助けたり提案したりできるなら、私はとても感謝しています.

4

3 に答える 3

3

コードの実際の問題は、長さを正しく計算していないことです。

これが私が試した機能です:

void ConflictResMenu::addMessages(std::string messages) {

    int idx = 0;
    for (int i = 0; i < messages.length(); i++) {
        if (messages[i] == this->delim) 
        {
            this->split_messages.push_back(messages.substr(idx, i-idx));
            idx = i + 2;
        }
    }
    if (idx <= messages.length())
    {
        this->split_messages.push_back(messages.substr(idx));
    }
}

(私はまたidx = i+2、の後のスペースを削除していました;

他の人が指摘したようにfind_first_of()、開始位置を使用して、少なくとも同様に機能します。

于 2013-08-27T11:47:29.193 に答える
2

find_first_of位置を取るオーバーロードがあります。ifループやステートメントはまったく必要ありません。

あなたの問題はfind_first_of、部分文字列の終了位置を決定するために使用する必要がある の結果を捨てており、その位置から開始するために後続の検索が必要なことです。完了すると、find_first_ofが返されますnpos。そのwhile条件に基づくループと、位置イテレータを使用すると、必要なものが得られるはずです。

于 2013-08-27T11:39:43.397 に答える