Вы можете использовать std::string::find()
функцию, чтобы найти положение разделителя строк, а затем использовать std::string::substr()
для получения токена.
Пример:
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
find(const string& str, size_t pos = 0)
Функция возвращает позицию первого вхождения str
в строку, или npos
если строка не найдена.
substr(size_t pos = 0, size_t n = npos)
Функция возвращает подстроку объекта, начиная с позиции pos
и длины npos
.
Если у вас есть несколько разделителей, после того, как вы извлекли один токен, вы можете удалить его (включая разделитель), чтобы продолжить последующее извлечение (если вы хотите сохранить исходную строку, просто используйте s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
Таким образом, вы можете легко получить цикл для получения каждого токена.
Полный пример
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
Вывод:
scott
tiger
mushroom
size_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
mushroom
выходы вне петли, т.s = mushroom
std::string token = s.substr(s.find(delimiter) + 1);
, если вы уверены, что он существует (я использую +1 в длину) ...Этот метод использует,
std::string::find
не изменяя исходную строку, запоминая начало и конец предыдущего токена подстроки.источник
Вы можете использовать следующую функцию для разделения строки:
источник
split("abc","a")
вернет вектор или одну строку,"bc"
где, я думаю, было бы больше смысла, если бы он вернул вектор элементов["", "bc"]
. Используяstr.split()
в Python, мне было интуитивно понятно, что он должен возвращать пустую строку в случае, еслиdelim
был найден в начале или в конце, но это только мое мнение. Во всяком случае, я просто думаю, что это должно быть упомянутоif (!token.empty())
проблему предотвращения, упомянутую @kyriakosSt, а также другие проблемы, связанные с последовательными разделителями.if (!token.empty())
, похоже, недостаточно для ее устранения.Для разделителя строк
Разделить строку на основе разделителя строк . Например, разделение строки
"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
на основе разделителя строк"-+"
, вывод будет{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Вывод
Для одиночного разделителя символов
Разделить строку на основе символьного разделителя. Например, разделение строки
"adsf+qwer+poui+fdgh"
с разделителем"+"
будет выводить{"adsf", "qwer", "poui", "fdg"h}
Вывод
источник
vector<string>
я думаю, что это вызовет конструктор копирования.Этот код разделяет строки текста и добавляет каждого в вектор.
Вызывается:
источник
vector<string> split(char *phrase, const string delimiter="\n")
strtok позволяет передавать несколько символов в качестве разделителей. Бьюсь об заклад, если вы передали "> =", ваша строка примера будет разделена правильно (даже если> и = считаются как отдельные разделители).
РЕДАКТИРОВАТЬ, если вы не хотите использовать
c_str()
для преобразования из строки в char *, вы можете использовать substr и find_first_of для токенизации.источник
strtok()
как если бы мне потребовалось использовать массив символов вместо строк..c_str()
это дешево и легко тоже.Вот мой взгляд на это. Он обрабатывает крайние случаи и принимает необязательный параметр для удаления пустых записей из результатов.
Примеры
источник
Это должно отлично работать для разделителей строк (или одного символа). Не забудьте включить
#include <sstream>
.Первый цикл while извлекает токен, используя первый символ разделителя строк. Второй цикл while пропускает оставшуюся часть разделителя и останавливается в начале следующего токена.
источник
Я бы использовал
boost::tokenizer
. Вот документация, объясняющая, как сделать соответствующую функцию токенизатора: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmВот тот, который работает для вашего случая.
источник
Ответ уже есть, но выбранный-ответ использует функцию стирания, которая очень дорогая, представьте себе очень большую строку (в МБ). Поэтому я использую ниже функцию.
источник
string.split()
метод Python .)Это полный метод, который разбивает строку на любой разделитель и возвращает вектор нарезанных строк.
Это адаптация от ответа от ryanbwork. Тем не менее, его проверка:
if(token != mystring)
дает неправильные результаты, если у вас есть повторяющиеся элементы в вашей строке. Это мое решение этой проблемы.источник
while (true)
обычно страшно видеть в таком фрагменте кода. Лично я бы порекомендовал переписать это так, чтобы сравнениеstd::string::npos
(или, соответственно, проверка сmystring.size()
) сделалоwhile (true)
устаревшим.Если вы не хотите изменять строку (как в ответе Винченцо Пии) и хотите также вывести последний токен, вы можете использовать этот подход:
источник
PS: работает, только если длины строк после разделения равны
источник
Функция:
Юнит-тесты:
источник
источник
источник