2017-08-09 104 views
2

我试图实现在C小splitStringByString()函数,这是我已经走了这么远:C拆分字符串函数在字符串的末尾返回 377而不是 0。为什么?

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。 我已经找到说这是一个八进制数左右的东西(stackoverflow),但对我来说不是很清楚。你能帮我,给我一些关于我做错了什么的建议吗?

非常感谢! :-)

+5

'i =(int)strlen(result); 结果[i - 1] ='\ 0';'如果字符串长度为0会怎么样?为什么null在它的中间终止一个字符串? –

+0

这个函数实际上做了什么?这个想法是什么? –

+3

您正在返回一个指向堆栈上的对象的指针 - 它将被覆盖。我的编译器不会编译这个,因为结果的定义不能被分配,因为大小不是恒定的。 –

回答

2

我不明白你的代码,但给你提什么在评论

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,它会被分配给你。但你需要记住要释放它;

+0

基本上就是这样;-)不记得如果找不到字符串,strstr不仅返回NULL,否则返回确切的位置。非常感谢。你为什么不理解我的代码,并且你知道我做错了什么? –

+1

@ T.Meyer:在你的代码中,你返回'result',它是一个本地数组。在大多数表达式中使用数组名称时,名称会衰减到第一个数组成员的地址。因此,您的代码将返回该函数本地对象的地址。但是,一旦局部对象不在范围内,它就会失效。从函数重新调用将使其所有本地对象失效。当你从一个'int'变量返回一个值时,你会得到这个值的一个副本,但是你不会从数组中获得这种行为。 – jxh

+1

@ T.Meyer - 我的建议 - 尝试将问题分解成更小的部分。写函数将会在另一个字符串中找到一个字符串的发生 - 它更容易并且分离逻辑。然后有了这个,解决你的问题非常容易。必须理清你刚刚迷路的两个谜题。 –

相关问题