Разделение строки с разделителями на 3 переменные

Я создал этот код, чтобы разбить строку на 3 разные строки str_days, str_column и str_time. Мне было интересно, если есть лучший способ разделить его на 3 переменные. Возможно, используя только 1, если заявление?

string::size_type pos = combinedString.find(';');
if (combinedString.npos != pos) {
combined2 = combinedString.substr(pos + 1);
str_days = combinedString.substr(0, pos);
}
string::size_type pos2 = combined2.find(';');
if (combined2.npos != pos2) {
str_column = combined2.substr(pos2 + 1);
str_time = combined2.substr(0, pos2);
}

-1

Решение

Ты можешь использовать std::istringstream с std::getline(), указав ';' в качестве разделителя строк, например:

#include <string>
#include <sstream>

std::string combinedString = ...;
std::string str_days, str_time, str_column;

std::istringstream iss(combinedString);
std::getline(iss, str_days, ';');
std::getline(iss, str_time, ';');
std::getline(iss, str_column);
1

Другие решения

Если вас это устраивает, вы можете обернуть кровавые детали за вариационной функцией:

#include <string>
#include <algorithm>

template <typename Iterator, typename Delimiter>
bool split_into(Iterator begin, Iterator end, Delimiter, std::string & first)
{
first.assign(begin, end);
return true;
}

template <typename Iterator, typename Delimiter, typename... Strings>
bool split_into(Iterator begin, Iterator end, Delimiter d, std::string & first, Strings & ... strings)
{
auto i = std::find(begin, end, d);

first.assign(begin, i);

if (i != end) {
return split_into(++i, end, d, strings...);
}

return sizeof...(Strings) == 0;
}

Затем вызовите так:

std::string combinedString("foo;bar;baz;widget");
std::string a, b, c;

split_into(combinedString.begin(), combinedString.end(), ';', a, b, c);

// a == "foo"// b == "bar"// c == "baz;widget"

split_into() вернет false, если не было найдено достаточного количества разделителей для заполнения всех переданных аргументов.

Живая демо

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector