我正在尝试编写一个函数,它接受一个字符串和一个分隔符作为输入并返回一个字符串数组。由于某种原因,以下代码会遇到分段错误。我想知道可能是什么问题?
char** split(string thing, char delimiter){
thing+='\0';//add null to signal end of string
char**split_string = new char*[100];
int i=0,j=0,l=0; //indexes- i is the ith letter in the string
// j is the jth letter in the lth string of the new array
int length = thing.length();
while (i < length){
if ((thing[i]!=delimiter && thing[i]!='\0')){
split_string[l][j]=thing[i];
j++;
}
else {
j=0; //reset j-value
l++;
}
i++;
}
return split_string;
}
答案 0 :(得分:1)
做完之后
char**split_string = new char*[100];
您仍然需要初始化您创建的100个char *指针中的每一个。
static const size_t str_len = 50; //assuming length will not exceed
for( size_t ix = 0 ; ix < 100 ; ++ix){
split_string[ix] = new char[str_len];
}
此外,你需要确保在写入split_string时你没有超过分配的内存,在这种情况下它的50,你不会有超过100的分割字符串。
答案 1 :(得分:1)
最好将std::string
拆分为std::vector<std::string>
。使用下面的功能
#include <sstream>
#include <string>
#include <vector>
std::vector<std::string> split(std::string str, char delim) {
std::vector<std::string> result;
std::stringstream ss(str);
std::string token;
while (getline(ss, token, delim))
result.push_back(token);
return result;
}
答案 2 :(得分:0)
每个char *
都必须单独初始化。
int len = 100;
char**split_string = new char*[len]; // len holds the number of pointers
for(int k = 0; k < len; k++) {
split_string[k] = new char[500]; // holds len of string (here Max word size is considered 500)
}
在C ++中,更倾向于使用std::string来降低复杂性并提高可读性。
您的代码将失败以抓住最后一个子字符串,因为您在找到\0
之前突然发现 while-loop 。要解决此问题,您需要将while (i < length)
更改为while (i <= length)
。
使用 vector&lt;字符串&gt; :
vector<string> split(string thing, char delimiter){
int len = 100;
vector<string> v;
char c[500];
int i=0,j=0;
int length = thing.length();
while (i <= length){
if ( thing[i] != delimiter && thing[i] != '\0') {
c[j]=thing[i];
j++;
}
else {
c[j] = '\0';
v.push_back(c);
memset(c, 0, sizeof c);
j = 0;
}
i++;
}
return v;
}
答案 3 :(得分:0)
1)当你找到一个新的子字符串时,请为每个子字符串(类似char [l] = new char [100])分配内存。
由于您不知道开头本身的子字符串数量,请考虑使用向量。考虑使用向量&lt;字符串&gt; split_string。在循环中,当您找到新的子字符串时,只需在向量中推送该字符串即可。最后,您将在向量中包含所有分割的字符串。