C ++中的拆分功能

时间:2017-07-26 04:27:28

标签: c++ arrays string pointers split

我正在尝试编写一个函数,它接受一个字符串和一个分隔符作为输入并返回一个字符串数组。由于某种原因,以下代码会遇到分段错误。我想知道可能是什么问题?

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;

}

4 个答案:

答案 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;
}

Demo

答案 3 :(得分:0)

1)当你找到一个新的子字符串时,请为每个子字符串(类似char [l] = new char [100])分配内存。

由于您不知道开头本身的子字符串数量,请考虑使用向量。考虑使用向量&lt;字符串&gt; split_string。在循环中,当您找到新的子字符串时,只需在向量中推送该字符串即可。最后,您将在向量中包含所有分割的字符串。