Разделение string на элементы массива через нужный символ

260
22 октября 2017, 22:17

Подскажите, а способа как использовать <vector> для разделения нужной мне строки на подстроки, которые будут заноситься в массив, нет?

Нужно из:

"Привет; Как; Дела"

Получить:

str[0]="Привет";
str[1]="Как";
str[2]="Дела";

Как в PHP - explode, а C# - split

Answer 1

Вроде это то, что вы хотели:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main ()
{
  vector<string> arr;
  string str ("Привет; Как; Дела");
  string delim("; ");
  size_t prev = 0;
  size_t next;
  size_t delta = delim.length();
  while( ( next = str.find( delim, prev ) ) != string::npos ){
    //Отладка-start
    string tmp = str.substr( prev, next-prev );
    cout << tmp << endl;
    //Отладка-end
    arr.push_back( str.substr( prev, next-prev ) );
    prev = next + delta;
  }
  //Отладка-start
  string tmp = str.substr( prev );
  cout << tmp << endl;
  //Отладка-end
  arr.push_back( str.substr( prev ) );
  return 0;
}
Answer 2

Стандартного способа нет. Нужно 1) либо писать свою функцию, 2) либо подключать внешнюю библиотеку, 3) либо преобразовывать std::string в c_str и использовать strtok. Например,

char *s = new char[source.size() + 1];
strcpy(s, source.c_str());
char *p = strtok(s, ";");
while (p! = NULL) {
    cout << p << endl;
    p = strtok(NULL, ";");
}
delete[] s;
Answer 3

Более "C++" способ следующий:

std::string sentence = "Hello how are you";
std::istringstream iss(sentence);
std::vector<std::string> tokens;
std::copy(std::istream_iterator<std::string>(iss),
          std::istream_iterator<std::string>(),
          std::back_inserter<std::vector<std::string> >(tokens));

В этом случае, правда, нельзя указать свой собственный разделитель. В качестве более удобной альтернативы могу предложить boost::string_algo.

Answer 4

Такая реализация работает даже на msvc2010

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems)
{
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim))
    {
        elems.push_back(item);
    }
    return elems;
}
std::vector<std::string> split(const std::string &s, char delim)
{
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
int main(int argc, char** argv)
{
    std::string sText;
    std::getline(std::cin, sText);
    std::vector<std::string> sWords = split(sText, ';');
    return 0;
}
READ ALSO
C++ - Неверный результат работы программы [требует правки]

C++ - Неверный результат работы программы [требует правки]

Решение задачи проходит только на 67,20 из 100И я совершенно не могу понять в чем проблема, перепробовал все что знаю, иногда выдает неправильный...

415
Простое слияние сортировка

Простое слияние сортировка

Не могу понять где теряет элементы файла после сортировки

268
Вхождение числа в массив

Вхождение числа в массив

Помогите исправить ошибку в функции

203
Превью статьи (PHP)

Превью статьи (PHP)

Вопрос от новичка, как сделать превью статьи с кнопкой "Read more", используя PHP? Знаю, что функцией substr, но не могу понять что к чему

196