Вопрос по visual-c++, c++ – Как разбить строки в vc ++?

1

У меня есть строка "stack + ovrflow * newyork;" Я должен разделить этот стек, переполнение, Нью-Йорк

любая идея??

Какой класс строки вы используете? или это символ *? Salgar

Ваш Ответ

6   ответов
5

Boost токенизатор

Просто так:

#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
std::string stringToTokenize= "stack+ovrflow*newyork;";
boost::char_separator<char> sep("+*;");
boost::tokenizer< boost::char_separator<char> > tok(stringToTokenize, sep);
std::vector<std::string> vectorWithTokenizedStrings;
vectorWithTokenizedStrings.assign(tok.begin(), tok.end());

Теперь у vectorWithTokenizedStrings есть токены, которые вы ищете. Обратите внимание на переменную boost :: char_separator. Он содержит разделители между токенами.

10

: tokenizer для такого рода задач (см. И ответьте на замечательные ответы ниже)

Без доступа к надстройке у вас есть несколько вариантов:

Вы можете использовать C ++ std :: strings и анализировать их, используя stringstream и getline (самый безопасный способ)

std::string str = "stack+overflow*newyork;";
std::istringstream stream(str);
std::string tok1;
std::string tok2;
std::string tok3;

std::getline(stream, tok1, '+');
std::getline(stream, tok2, '*');
std::getline(stream, tok3, ';');

std::cout << tok1 << "," << tok2 << "," << tok3 << std::endl

Или вы можете использовать одну из функций семейства strtok (см. Ответ Naveen для версии, не связанной с юникодом; см. Комментарии xtofls ниже для предупреждений о безопасности потоков), если вы знакомы с указателями на символы

char str[30]; 
strncpy(str, "stack+overflow*newyork;", 30);

// point to the delimeters
char* result1 = strtok(str, "+");
char* result2 = strtok(str, "*");
char* result3 = strtok(str, ";");

// replace these with commas
if (result1 != NULL)
{
   *result1 = ',';
}
if (result2 != NULL)
{
   *result2 = ',';
}

// output the result
printf(str);
Error: User Rate Limit ExceededstrtokError: User Rate Limit ExceededchooseError: User Rate Limit ExceededstringError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededstrtokError: User Rate Limit ExceededgetlineError: User Rate Limit ExceededstringstreamError: User Rate Limit ExceededstrtokError: User Rate Limit ExceededappearsError: User Rate Limit ExceededstrtokError: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/2c8d19sb(v=vs.71).aspx)
Error: User Rate Limit Exceeded
2

_tcstok токенизировать строку на основе разделителя.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

которая принимает строку символов для использования в качестве разделителей и возвращает вектор строк.

Функция простого жетона строки STL

1

Сначала определите функцию для разделения строки:

//pointers of the substrings, assume the number of fields will not be over 5
char *fields[5];   
//str: the string to splitted
//splitter: the split charactor
//return the real number of fields or 0 if any error exits
int split(char* str, char *splitter)
{
    if(NULL == str) 
    {
        return 0;
    }

    int cnt;
    fields[0] = str;
    for(cnt = 1; (fields[cnt] = strstr(fields[cnt - 1], splitter)) != NULL && 
            cnt < 5; cnt++)
    {
        *fields[cnt] = '\0';
        ++fields[cnt];
    }
    return cnt;
}

тогда вы можете использовать эту функцию для разделения строки следующим образом:

char* str = "stack+ovrflow*newyork;"
split(str, "+");
printf("%s\n", fields[0]); //print "stack"
split(fields[1], "*");
printf("%s\n", fields[0]); //print "ovrflow"
split(fields[1], ";");
printf("%s\n", fields[0]); //print "newyork"

этот способ будет более эффективным и многоразовым

Error: User Rate Limit Exceeded
4
Error: User Rate Limit Exceeded

Похожие вопросы