C split string函数在字符串末尾返回\377,而不是\0。为什么?

C split string函数在字符串末尾返回\377,而不是\0。为什么?,c,C,我曾尝试在C中实现一个小的splitStringByString()函数,我就是这样做到的: char* splitStringByString(char* string, char* delimiter){ int i = 0, j = 0, k = 0; while(*(string + i) != '\0'){ j = i; while((*(string + j) == *(delimiter + k)) && (*(str

我曾尝试在C中实现一个小的splitStringByString()函数,我就是这样做到的:

char* splitStringByString(char* string, char* delimiter){
    int i = 0, j = 0, k = 0;
    while(*(string + i) != '\0'){
        j = i;
        while((*(string + j) == *(delimiter + k)) && (*(string + j) != '\0')){
            if(*(delimiter + k + 1) == '\0'){
                // return string from here.
                char result[(strlen(string) - strlen(delimiter) + 1)];  // + 1 for '\0'
                i = 0;
                j++;
                while(*(string + j) != '\0'){
                    result[i] = *(string + j);
                    i += 1;
                    j++;
                }
                i = (int)strlen(result);
                result[i - 1] = '\0';
                return result;
            }
            k++;
            j++;
        }
        i++;
    }

    return NULL;
}
所以它或多或少起作用; 该函数按需要返回分隔符后面的字符串,但该字符串末尾(最后一个字符)始终为\377。 我已经找到一些东西说这是一个八进制数左右(),但我不太清楚。你能帮助我,给我一些关于我做错了什么的建议吗


非常感谢!:-)

我不理解你的代码,但我想做你在评论中提到的事情

char *splitSstring(char *haystack, char *separator)
{
    char *result = (haystack == NULL || separator == NULL || !strlen(haystack) || !strlen(separator)) ? NULL : haystack;

    if (result != NULL)
    {
        result = strstr(haystack, separator);
        if (result != NULL) result += strlen(separator);
    }
    return result;
}
或者如果你想把它放在单独的字符串中

char *splitSstring(char *haystack, char *separator, char *res)
{
    char *result = (haystack == NULL || separator == NULL || !strlen(haystack) || !strlen(separator)) ? NULL : haystack;

    if (result != NULL)
    {
        result = strstr(haystack, separator);
        if (result != NULL)
        {
            result = result + strlen(separator);
            if(res == NULL) res = malloc(strlen(result) + 1);
            if(res != NULL) strcpy(res, result);
            result = res;
        }
    }
    return result;
}

您可以为函数提供自己的缓冲区,如果传递NULL,则会为您分配缓冲区。但你需要记住释放它

i=(int)strlen(结果);结果[i-1]='\0'如果字符串长度为0怎么办?为什么NULL在它中间终止一个字符串?返回一个指向堆栈上对象的指针,它将被覆盖。我的编译器不会编译它,因为无法分配结果的定义,因为大小不是常数。@BrianWalker您将此编译为
C
而不是
C++
是吗?我的似乎编译得很好。
i=(int)strlen(result)
:如果最后一个字符不是0,那么
strlen
不起作用…@BrianWalker:C.1999有一个称为VLA(可变长度数组)的功能。并非所有编译器都符合C.1999。C.2011使VLA成为可选功能。基本上就是这样;-)我不记得strstr不仅在找不到字符串时返回NULL,否则还返回确切位置。谢谢。为什么你不理解我的代码,你知道我做错了什么吗?@t.Meyer:在你的代码中,你返回
结果
,这是一个本地数组。当在大多数表达式中使用数组名时,该名称将衰减为第一个数组成员的地址。因此,代码返回函数本地对象的地址。但是,一旦本地对象不再在作用域中,它就会变得无效。从函数重新调整将使其所有本地对象无效。当您从
int
变量返回一个值时,您会得到该值的一个副本,但您不会从数组中得到该行为。@t.Meyer-我的建议-尝试将问题分解为较小的部分。编写一个函数,该函数将查找一个字符串在另一个字符串中的出现情况-这更容易,并且可以分离逻辑。有了这个,解决问题就非常容易了。必须整理这两个谜题,您才刚刚迷路。@T.Meyer您没有任何内存泄漏,因为您没有分配任何内存。内存泄漏是指内存已分配但未释放,并且丢失给程序/系统。你只是有很多UB(比如返回指向不存在的对象的指针,遍历非空终止的内存位置,然后在随机位置向内存写入一些东西等等)