Задать вопрос
paulenot
@paulenot
IT Issue

Как написать explode() на c++?

Я только начал писать на С++, решил начать с написания функции, но не понимаю, как то все очень криво, такое количество ошибок у меня небыло ни с одним языком. Помогите понять, что я тут не правильно делаю. Функция explode() на PHP режет строку по разделителю.
#include <iostream>
#include <vector>
#include <string>

vector<string> explode(string separator, string input){
    string line;
    int count = 1;
    vector<string> output {};
    for (int i = 0; input[i] != '\0'; ++i) {
        if (input[i] == separator) {
            output.push_back(line);
            line = "";
            count++;
        } else {
            line += input[i];
        }
    }
    return output;
}

int main(){
    int count = 1;
    vector<string> msg = explode(".", "a.b.c.d");
    for (const string& word : msg){
        cout << count << " => " << word << endl;
        count++;
    }
    return 0;
}
  • Вопрос задан
  • 426 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@WAR_VIK
Вот функция для разделителя с любым количеством символов:
std::vector<std::string> explode(std::string separator, std::string input) {
      std::vector<std::string> vec;
      for(int i{0}; i < input.length(); ++i) {
            int pos = input.find(separator, i);
            if(pos < 0) { vec.push_back(input.substr(i)); break; }
            int count = pos - i;
            vec.push_back(input.substr(i, count));
            i = pos + separator.length() - 1;
      }
return vec;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@galaxy
Добавьте using namespace std; после заголовков (хотя, конечно, лучше явно писать std::vector, std:string).

Вот этого input[i] != '\0' делать не стоит, ибо, если не ошибаюсь, плюсы уже не гарантируют наличие терминатора в конце строки, и в любом случае это будет обращение за пределы длины строки, что есть Undefined behavior.

Ваш код последний кусок строки не добавляет в массив.
В PHP separator может состоять из нескольких символов, у вас - из одного. Тут нужно что-то типа string::find() использовать для поиска подстроки.
Ответ написан
Комментировать
По ссылке blog.ivru.net/?id=315 пример функции explodeItem которая в отличии от PHP функции explode возвращает не массив полученный при разбиении строки по сепаратору а только один элемент по его порядковому номеру после разбиения, с учётом того что первый элемент имеет номер - 0.

Возможно не то что Вам требуется, при этом некоторые моменты написания требуемой функции понять можно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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