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;
}
  • Вопрос задан
  • 383 просмотра
Решения вопроса 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.

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

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

Войти через центр авторизации
Похожие вопросы