Проблема strtok C++11

279
09 декабря 2017, 08:20

Написал свою функцию split (Как, например, в Java или Python):

   char **split(char *str, char *tok, int *len) {
        char **out = new char*[1];
        (*len) = 0;
        char *token = strtok(str, tok);
        while (token != nullptr) {
            out[(*len)++] = token;
            char **copy = new char*[(*len) + 1];
            for (int i = 0; i < (*len); i++)
                copy[i] = out[i];
            delete[] out;
            out = copy;
            token = strtok(0, tok);
        }
        return out;
    }
    int main() {
        int len = 0;
        char **dataBase = split("asdasd asd asdasdasd asdasd asdasd asdadsasd asd", " ", &len);
        return 0;
    }

Однако, не работает - код ошибки 139, из-за строки char *token = strtok(str, tok); (проверил в дебагере). Вопрос: что я делаю не так?

Answer 1

Я не знаю что такое "код ошибки 139", но сразу бросается в глаза, что в качестве первого аргумента вы передаёте строку, которую изменять нельзя. На попытке вызвать для неё strtok() код, очевидно, грохнется с чем-нибудь вроде Segmentation fault.

P.S. Ну и да, так велосипедить в C++ - смысл?

Answer 2

Вы не хотите - раз уж у вас С++ - получать vector<string>? Это куда логичнее, никаких утечек памяти, никаких проблем с освобождением потом...

Исправлять ваш код сложно, потому что вы в нем запутались в массиве указателей и делаете совсем не то - его надо переписывать. Но если уж это С++ (более того, С++11, как вы сами пишете) - то проще сделать так, если уж хотите получить массив строк:

vector<string> split(const char *str, const char *tok)
{
    vector<string> res;
    string s(str);
    for(char *token = strtok(s.data(),tok);
        token;token = strtok(nullptr,tok))
    {
        res.emplace_back(token);
    }
    return res;
}
READ ALSO
Вопрос про Winium + Jenkins

Вопрос про Winium + Jenkins

Вопрос 1: Я запускаю тесты на виртуалкеЧтобы тесты проходили на них нужно смотреть - т

265
Мобильный номер телефона android

Мобильный номер телефона android

Как достать номер телефона? Какой нибудь способ 100% вывести номер телефона (самому пользователю не доверяю)

258
Java Unicode вывод

Java Unicode вывод

Есть 16 ричное представление числа,как с помощью Systemout

216