我为c ++编写了一个函数split,因为我需要在我的程序中使用它,但它会随机崩溃程序。如果我继续重新启动相同的示例程序,它有时会起作用,有时它会崩溃。
这是功能:
char ** split(char * string, char delimiter, int &num_substrings)
{
num_substrings = 0;
char ** substrings = NULL;
int temp_len = 0;
int string_pos = 0;
substrings = (char **) calloc(1, sizeof(char*));
substrings[num_substrings] = (char *) calloc(1, sizeof(char));
while(string[string_pos] != '\0')
{
if(string[string_pos] == delimiter)
{
num_substrings++;
substrings = (char **) realloc(substrings, (num_substrings + 1) * sizeof(char*));
substrings[num_substrings] = (char *) calloc(1, sizeof(char));
temp_len = 0;
}else{
substrings[num_substrings] = (char *) realloc(substrings[num_substrings], (temp_len + 1) * sizeof(char));
substrings[num_substrings][temp_len] = string[string_pos];
temp_len++;
substrings[num_substrings][temp_len] = '\0';
}
string_pos++;
}
return substrings;
}
以下是我测试它的方法(主要功能):
int main()
{
char *s = "1|3|teststring|";
char ** args = NULL;
int num = 0;
args = split(s, '|', num);
cout<<num<<"\n";
cout<<args[0];
}
我正在用codeblocks编译它,但是使用microsoft visual studio也是一样的结果。
答案 0 :(得分:2)
要按原样回答问题,{{1}}不够大,因为您在此代码中增加了temp_len+1
:
temp_len
但我同意使用 substrings[num_substrings] = (char *) realloc(substrings[num_substrings],
(temp_len + 1) * sizeof(char)); // Allocation here
// ...
temp_len++;
substrings[num_substrings][temp_len] = '\0'; // Invalid write 1 byte after
或std::string
。