2013-10-15 177 views
0

我一直在试图创建一个函数,它将字符串分开并返回指向数组的第一个元素的指针。它编译没有错误,但是当我运行它的程序崩溃。这是我的代码。任何关于如何解决这个问题的帮助。谢谢。c指针阵列

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define split_count(a) a 

int count(char *str, char *sub) { 
    int sublen = strlen(sub); 
    int templen = 0; 
    int count = 0; 

    if (sublen > strlen(str)) 
     return 0; 

    int i, j; 
    for (i = 0; i < strlen(str); i++) { 
     if (*(str + i) == *sub) { 
      templen = 1; 
      for (j = 1; j < sublen; j++) { 
       if (*(str + i + j) == *(sub + j)) { 
        templen += 1; 
       } 
      } 

      if (templen == sublen) { 
       count += 1; 
      } 

      templen = 0; 
     } 
    } 

    return count; 
} 

char * split(char *str, char *sep, int maxsplit) { 
    if (!count(str, sep)) 
     return NULL; 

    char *arr[split_count(count(str, sep)) + 1]; 

    int i, j; 
    int templen = 0; 

    int stop = 0; 

    int counter = 0; 

    for (i = 0; i < strlen(str); i++) { 
     if (*(str + i) == *sep) { 
      templen = 1; 

      for (j = 1; j < strlen(sep); j++) { 
       if (*(str + i + j) == *(sep + j)) { 
        templen += 1; 
       } 

       if (templen == strlen(sep)) { 
        arr[counter] = (char*)malloc(sizeof(char) * strlen(str)); 

        strcpy(arr[counter], ""); 

        int k; 
        for (k = stop; k < i; k++) { 
         *(arr[counter] + strlen(arr[counter])) = *(str + k); 
         *(arr[counter] + strlen(arr[counter])) = '\0'; 
        } 

        stop = i + strlen(sep); 

        counter++; 
       } 
      } 
     } 
    } 

    return arr[0]; 
} 

int main() { 
    char *before = "This is a house isisis is"; 

    printf("%s\n", split(before, "is", 1)); 

    return 0; 
} 
+0

这是没有办法编译没有警告。您应该开启编译警告。 – user694733

+0

你应该避免重复调用'strlen()'。由于'str'不会改变它的长度,因此最好确定一次并使用该值。这可以节省时间。 – glglgl

回答

1

除了Acme的答案,你可能不修改一个​​:

看起来你的循环通过str,增加i高达i < strlen(str),但是,下面你去str+i+j。当j是10并且你在str的最后时会发生什么?最有可能最终超出内存范围的是str导致分段错误。

我建议您通过string.h查看您已经包含的内容。有一些功能可以以更安全的方式进行。

1

char *before = "This is a house isisis is"; 

是一个指向字符串字面"This is a house isisis is" - 修改它会使程序崩溃。

使用此:

char before[50] = "This is a house isisis is"; 

也将拆分函数有一个无限循环。

+0

“修改它会使程序崩溃”〜它不一定会崩溃,但它在只读内存中,并且试图修改它会产生UB,是的。 – LihO