我有一个 C++ 函数,它在遇到分隔符时将 char 数组拆分为多个 char 数组。出于某种原因,当保存第三个拆分数组时,程序会崩溃,有时会返回 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 个字符长的 char 数组中保存大词(我正在测试的词长于 10 个字符)?当我将其更改为new char[1]
但是它再次开始崩溃,但仅在第三次循环迭代之后再次崩溃。所以它以某种方式将前 2 个单词保存在 1 个字符长的数组中?
EDIT2:现在它甚至神奇地开始工作了new char[garums]
. 这里确实有问题,有人有什么想法吗?