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;
}
  • Вопрос задан
  • 193 просмотра
Решения вопроса 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;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Добавьте using namespace std; после заголовков (хотя, конечно, лучше явно писать std::vector, std:string).

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

Ваш код последний кусок строки не добавляет в массив.
В PHP separator может состоять из нескольких символов, у вас - из одного. Тут нужно что-то типа string::find() использовать для поиска подстроки.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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