У меня есть функция С++, которая разбивает массив символов на несколько массивов символов, когда он встречает разделитель. Почему-то при сохранении третьего разбитого массива программа просто вылетает и иногда возвращает исключение std::bad_alloc.
char ** explode(const char * arr, const char delim) {
int start, end, curr=0, count=1;
char ** strings;
//Iegūst explodēto stringu skaitu
for (int i = 0; arr[i] != 0; i++) {
if (arr[i] == delim && i != 0 && arr[i+1] != 0 && arr[i+1] != delim ) { //Nav pirmais, nav pēdējais, nav pa labi vēlviens delimiters
count++;
}
}
strings = new char*[count];
start = 0;
for (int i = 0; arr[i] != 0; i++) {
if (arr[i] == delim || arr[i+1] == 0) {
if (arr[i] == delim) {
end = i;
} else {
end = i+1;
}
if (end-start < 1) {
start++;
} else {
copystring(arr,strings[curr++],start,end-start);
start = i+1;
}
}
}
for (int i = 0; i < count; i++) {
cout << strings[i] << endl;
}
return strings;
}
//Pārkopē daļu no pirmā char masīva uz otru, no START pozīcijas, līdz GARUMS garumā
void copystring(const char * from, char *& to, const int start, const int garums) {
int curr=0;
if (garums < 1 || start > charlen(from)) {
return;
}
to = new char[garums];
for (int i = start; i < start+garums && from[i] != 0; i++) {
to[curr++] = from[i];
}
to[curr] = 0;
}
Трудно сказать, потому что на самом деле это не говорит мне, на какой строке что-то идет не так, но я думаю, что это происходит на
to = new char[garums];
Я пытался отладить эту строку в CodeBlocks, но по какой-то причине при использовании точек останова и отслеживании переменных приложения работают нормально и выполняются правильно. Вылетает только при нормальной работе, без отладки...
Также обратите внимание, что я не могу использовать строки или любую другую библиотеку, кроме fstream и iostream.
РЕДАКТИРОВАТЬ: я попытался изменить часть new char[garums]
на new char[100]
, и она волшебным образом заработала. Проблема в том, что я тогда изменил его на new char[10]
, и в этом случае все еще работало. Я даже вывел сохраненный текст в консоль, и она все правильно сохранила. Как он мог сохранить большие слова в массиве символов длиной 10 символов (слова, которые я тестирую, длиннее 10 символов)? Когда я изменил его на new char[1]
, он снова начал падать, но снова только после 3-й итерации цикла. Таким образом, он каким-то образом сохранил первые 2 слова в массиве длиной в 1 символ?
EDIT2: И теперь он волшебным образом начал работать даже с new char[garums]
. Что-то здесь действительно не так, у кого-нибудь есть идеи?
garums
перед каждымnew char[garums]
- person gha.st   schedule 27.04.2014