Разбить строку на слова С++

У меня есть код

std::string tmp;
std::stringstream ss(input);
std::vector<std::string> words;

while(std::getline(ss,tmp, ' ')){
    words.push_back(tmp);
}


for(long unsigned int i = 0; i < words.size(); i++){
    std::cout << words[i] << std::endl;
}

Строку по типу "one two three" разбивает как надо,но как мне тут учесть запятые допустим,к примеру строка one,two three"


Ответы (2 шт):

Автор решения: AR Hovsepyan

Именно какой синтаксический анализатор вам нужен не до конца понятно. Но std::istream::operator>> и так считывает до символа разделителя, поэтому std::getline не нужна. Если хотите убрать конечные запятые, то:

while (ss >> tmp) {         
    if (tmp.back() == ',')
        tmp.pop_back();
    words.push_back(tmp);
}

Если хотите разделять tmp по какому то символу(например, если запятые есть в любом месте слова), тогда тут можно использовать один из многочисленных вариантов. Чисто для демонстрации с применением std::getline можно использовать не самый удачный вариант:

while (ss >> tmp) {        
    std::istringstream s(tmp);         
    bool valid = true;
    while (std::getline(s, tmp, ','))
    {
        valid = false;
        words.push_back(tmp);
    }
    if (valid) {
        if (tmp.back() == ',')
            tmp.pop_back();
        words.push_back(tmp);
    }
}

Если вам нужно обработать строку, то используйте методы класса _ это самый эффективный способ. Для разбиения строки по нескольким разделителям, используйте std::string::find_first_of. Как это сделать? В сайте бывали такие вопросы, так что на них уже отвечали. Поищите, покопайтесь и найдете, а лучше пытайтесь решать самостоятельно.

→ Ссылка
Автор решения: ampawd

откройте для себя strtok

работает для всех разделителей

std::string input = "one,two three  four,  five\nsix seven , eight";
std::cout << "input: \n" << input << '\n';
std::stringstream ss(input);

std::vector<std::string> words;    
const char* const delimeters = ", ";
std::string line;
while (std::getline(ss, line))
{
    char* token = std::strtok(line.data(), delimeters);        
    while (token != nullptr)
    {         
        words.push_back(token);            
        token = std::strtok(nullptr, delimeters);               
    }
}

std::cout << "words: \n";
for (long unsigned int i = 0; i < words.size(); i++)
{
    std::cout << words[i] << std::endl;
}
→ Ссылка