@Xaxatuxa

Как разделить строку до и после определённого символа?

Например, есть строка name^age и нужно разделить name от age и узнать оба значения, как это можно реализовать?
  • Вопрос задан
  • 842 просмотра
Решения вопроса 1
@serhiops
Python/JavaScript/C++
Стандартного способа нет, нужно либо самому функцию писать, либо искать какие-то библиотеки. Ну еще можно попробывать из класса string сделать С-шную строку и использовать strtok:
char *s = new char[yourString.size() + 1];
strcpy(s, yourString.c_str());
char *p = strtok(s, "^");   //тут указываете разделитель
while (p! = NULL) {
    cout << p << endl;
    p = strtok(NULL, "^");
}
delete[] s;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Вариант с "токенизацией" делит один единственный буфер на несколько Си строк, т.е. там просто записывается завершающий 0 вместо разделителей. Это быстро и довольно просто, ничего никуда не копируется, дополнительная память не выделяется. Но надо иметь ввиду, что используется один и тот же буфер и если вы его не аккуратно перезапишите (не важно по какому указателю на внутренние строки), то ваши строки "испортятся". Освобождая память под этим буфером надо, естественно, по указателю на начало буфера, а не по указателю на произвольную строку внутри буфера. Освободив буфер надо иметь ввиду, что все строки, содержащиеся в буфере то же освободились.

Вариант с выделением подстрок и генерацией массива строк - возможно проще, но достаточно медленный. Т.к. для каждой подстроки выделяется динамическая память и подстрока копируется в новое расположение. Каждую результирующую строку надо удалять отдельно, что то же добавляет накладных расходов.

Оба варианта имеют место быть. Выбирать надо тот, что больше ложится на вашу главную задачу, т.к. разделение строк, я думаю, это не самоцель, а некая подзадача.

Если же вам надо только "вывести подстроку", то можно просто искать позицию разделителя, с его помощью вычислять размер левой подстроки и используя printf("%*s", len, leftstr); выводить левую подстроку. Дальше сохраняем указатель на начало правой подстроки, ищем от него следующий разделитель, то, что раньше было правой подстрокой становится левой, точно так же выводим и т.д. в цикле.
Вместо printf можно выводить так: cout << setw(len) << leftstr;
Ответ написан
Комментировать
@WAR_VIK
Можно вот так:
#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> split(std::string str, char delimiter) {
    std::string tmp{""};
    std::vector<std::string> vec;
    for(int i{0}; i < str.length(); ++i) {
        if(str[i] == delimiter) { vec.push_back(tmp); tmp = ""; continue; }
        tmp += str[i];
    }
    vec.push_back(tmp);
    return vec;
}

int main()
{
    std::string s{"name^age"};
    std::vector<std::string> res = split(s, '^');
    std::cout << "Result is: ";
    for(auto i : res) std::cout << i << ' ';
    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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