Разбить строку на слова С++
У меня есть код
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 шт):
Именно какой синтаксический анализатор вам нужен не до конца понятно. Но 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. Как это сделать? В сайте бывали такие вопросы, так что на них уже отвечали. Поищите, покопайтесь и найдете, а лучше пытайтесь решать самостоятельно.
откройте для себя 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;
}