C ++找不到&#34 ;;"在一个字符串中

时间:2013-08-27 11:30:18

标签: c++ if-statement vector

我的问题是我已经定义了一个字符串:

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!

老实说,我不知道这里发生了什么。如果有人可以帮助或建议更好的方法来解决这个问题,我将非常感激。

3 个答案:

答案 0 :(得分:4)

您可以使用std::istringstreamstd::getline分割字符串:

std::istringstream is(messages);

std::string msg;
while (std::getline(is, msg, ';'))
{
    split_messages.push_back(msg);
}

答案 1 :(得分: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()至少也可以使用起始位置。

答案 2 :(得分:2)

find_first_of有一个占位的重载。您根本不需要循环 - 或if语句。

您的问题是您丢弃了find_first_of的结果,您需要使用该结果来确定子字符串结束位置,并且您需要后续搜索才能从该位置开始。完成后,find_first_of会返回npos。基于该条件的while循环以及位置迭代器应该为您提供所需的内容。