字符串在c中拆分而不更改原始字符

时间:2018-03-21 22:05:54

标签: c split

我们有一个学校作为一个特定的字符串拆分功能 给出函数的头和参数不能改变它们。 此函数应将原始分隔符拆分为字符串数组,该字符串存储未包含的字符串分隔符的每个部分,并在每个分隔符增加大小的附加项中

void stringSplit(const char *original, char result[50][256], int* size, char delim){
    size_t begin = 0;
    if(!original){
        return;
    }
    for(size_t i=0; i<strlen(original);i++ ){
        if (original[i] == delim){
            int str_begin = 0;
            for( ; begin < i; begin++ ){
                result[*size][str_begin] = original[begin];
                str_begin++;
            }
            (*size)++;
            begin ++ ;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这个想法没问题,但你有几个错误:

您的字符串副本不是'\0' - 已终止。你也没有参加 多个分隔符连续跟随时的帐户。

如果您不被允许使用 像strchrstrncpy这样的功能,你可以这样做:

size_t str_begin = 0;
*size = 0; // the user may have passed an uninitialized int variable

for(size_t i = 0; original[i] && *size < 50; ++i)
{
    if(original[i] == delim)
    {
        size_t sublen = i - str_begin;
        if(sublen == 0)
        {
            // skip delimiter, last character was also a
            // delimiter and/or the first character in
            // original is a delimiter
            str_begin++;
            continue;

            // or if you want to have empty words instead of skipping
            // results[*size] = 0;
            // (*size)++;
        }

        if(sublen > 256)
            sublen = 256;

        for(size_t j = 0; j < sublen; ++j)
            result[*size][j] = original + str_begin + j;

        result[*size][j] = 0; // \0-terminating string

        (*size)++;
        str_begin = i + 1; // updating str_begin to next char
    }
}

答案 1 :(得分:0)

这样做的直接方式是 - 正如Barmar建议的那样 - 制作原始字符串的副本,然后使用strtok()strcpy

或者,您可以在循环中使用strchr来查找分隔符,并使用memcpy来复制先前分隔符和下一个分隔符之间的内存。请参阅以下代码,该代码还考虑了结果数组的边界:

void stringSplit(const char *original, char result[50][256], int *size, char
                 delim)
{
    if(!original){
        return ;
    }

    *size = 0;
    const char* nextDelim;
    const char* prevDelim = original;
    do  {
        nextDelim = strchr(prevDelim,delim);
        size_t len = nextDelim ? (nextDelim - prevDelim) : strlen(prevDelim);
        if (len >= 256) {
            len = 256-1;
        }
        memcpy(result[*size],prevDelim,len);
        result[*size][len] = '\0';
        (*size)++;
        prevDelim = nextDelim ? nextDelim+1 : NULL;
    }
    while(nextDelim && *size < 50);
}

int main() {

    char result[50][256];
    int  size;
    stringSplit("Hello, this, is", result, &size, ',');

    return 0;

}

希望它有所帮助。