Подтвердить что ты не робот

Разбиение строки пробелом в С++

Возможные дубликаты:
С++: как разбить строку? Разделение строки

Каков наилучший способ разделить строку на пробел в С++?

Я бы хотел разбить его на основе вкладок, пробелов и т.д. и, конечно, игнорировать несколько вкладок/пробелов и т.д. в строке, а также не имеют проблем с тем, что происходит в конце.

В конечном итоге я собираюсь сохранить это в векторе, но я могу легко преобразовать между типами данных, если есть простой встроенный стандартный способ расщепления библиотеки.

Я создаю это на машине UNIX с g++, не с помощью Microsoft Visual С++

4b9b3361

Ответ 1

Можно ли задаться вопросом, лучше ли это, но один очень простой способ сделать это - поместить вашу строку в строковый поток, а затем прочитать данные:

// warning: untested code.
std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input);
    std::vector<std::string> ret;

    std::copy(std::istream_iterator<std::string>(buffer), 
              std::istream_iterator<std::string>(),
              std::back_inserter(ret));
    return ret;
}

Если вы предпочитаете, вы можете инициализировать vector непосредственно из итераторов:

std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input);
    std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)), 
                                 std::istream_iterator<std::string>());
    return ret;
}

Либо должен работать с любым разумным компилятором С++. С С++ 11 вы можете немного почистить вторую версию, используя вместо этого функцию brace-initialization:

    std::vector<std::string> ret{std::istream_iterator<std::string>(buffer), 
                                 std::istream_iterator<std::string>()};

Ответ 2

Это может быть излишним для этой конкретной проблемы, но рассмотрим Boost.Regex.

(Честно говоря, я мог бы просто написать script, который отвечал на каждый вопрос С++ на SO с помощью "Use Boost" и выходил вперед в карме, но это действительно помогает).

Ответ 3

Это то, что я использую:

/* Tokenizing a string */
    std::vector<std::string> Parser::tokenizer( const std::string& p_pcstStr, char delim )  {
        std::vector<std::string> tokens;
        std::stringstream   mySstream( p_pcstStr );
        std::string         temp;

        while( getline( mySstream, temp, delim ) ) {
            tokens.push_back( temp );
        }

        return tokens;
    } 

Ваш delim будет пробелом, p_pcstStr будет строкой tokenize, а return будет вектором со всеми строками, у которых есть пробел между ними.