Работа со строками (string) в С++

188
24 декабря 2021, 05:00

Подскажите как можно сделать сие действие:

есть n-ое кол-во строк вида: 1. Какой-то текст. 2. Какой текст.

Нужно сформировать массив строк, где каждый элемент(строка) будет в виде:

  1. Какой-то текст.

На С# получилось сделать легко, на С++ пока не осилил.

К примеру:

// Исходные данные
string str = "1. Подъем в 8 утра. 2. Подъем в 9 утра. 3.Подъем в 10 утра."
// Выходные данные - массив строк, где:
stringArray[0] == "1. Подъем в 8 утра.";
stringArray[1] == "2. Подъем в 9 утра.";
stringArray[2] == "3. Подъем в 10 утра."
Answer 1

Здесь нашел ответ: https://stackoverflow.com/questions/236129/how-do-i-iterate-over-the-words-of-a-string?page=1&tab=votes#tab-top

С учетом того, что я имел возможность добавить свой разделитель (я выбрал '&'), правда не знаю, "нормально" ли это?

Что у меня получилось:

    string buf; // Строка используется в качестве буфера
    string stringFromUserFile = trip.GetStringFromUserFile(); // Получение строки, из которой нужно сформировать массив(с уже добавленным разделителем)
    stringstream iss(stringFromUserFile); // Вставляем полученную строку в поток(если правильно понял)
    vector<std::string> tokens; // Используем std::vector для хранения наших строк
    // Считываем строки из потока в buf, используя разделитель '&'
    while (getline(iss, buf, '&'))
    {
        tokens.push_back(buf); // Вставляем в конец tokens считанную строку
    }

Спасибо AR Hovsepyan и Harry за отклик.

Answer 2

Наконец то выяснилось что вам нужно. Кажется это:

std::vector<std::string>
split(const std::string& s, char delim = '.')
{
    std::vector<std::string> v;
    size_t p = 0, sz = 0;
    while (sz != s.npos) {
        p = s.find_first_not_of(delim, sz);
        //если нужно пропустить пробелы
        p = s.find_first_not_of(' ', p);
        if (p == s.npos) break;
        sz = s.find(delim, p);
        //и если нужно одну точку пропустить
        if (delim == '.')
            sz = s.find(delim, sz + 1);
        v.push_back(s.substr(p, sz - p));            
    }
    return v;
}

Но еще не понятно, точка после какой то цифры учитывается или нет.

auto stringArray = split(str);
for (int i = 0; i < stringArray.size(); ++i)
   cout << stringArray[i] << '\n';
READ ALSO
Работа с valarray и струкутрами

Работа с valarray и струкутрами

Есть некоторая структура

176
Поиск подстроки в std::vector&lt;string&gt;

Поиск подстроки в std::vector<string>

Подскажите как решить следующую задачу оптимальным путем:

129
Как передать массив в конструктор в C++?

Как передать массив в конструктор в C++?

Я реализовываю свой класс vector, но у меня возникла проблема: как передать в конструктор массив в таком виде: ClassName object = {1, 2, 3, 4, 5};?

179
Проверка ввода только одного символа

Проверка ввода только одного символа

Написать программу, печатающую символы от A до введенного с клавиатуры символа (последний возможный: Z)Для каждого символа вывести номер,...

94