Написал свою функцию 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);
(проверил в дебагере). Вопрос: что я делаю не так?
Я не знаю что такое "код ошибки 139", но сразу бросается в глаза, что в качестве первого аргумента вы передаёте строку, которую изменять нельзя. На попытке вызвать для неё strtok()
код, очевидно, грохнется с чем-нибудь вроде Segmentation fault
.
P.S. Ну и да, так велосипедить в C++ - смысл?
Вы не хотите - раз уж у вас С++ - получать 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Вопрос 1: Я запускаю тесты на виртуалкеЧтобы тесты проходили на них нужно смотреть - т
Как достать номер телефона? Какой нибудь способ 100% вывести номер телефона (самому пользователю не доверяю)