0

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

#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;
}
4

2 回答 2

1

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

是指向字符串文字的指针"This is a house isisis is"- 修改它会使程序崩溃。

用这个:

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

你的 split 函数也有一个无限循环。

于 2013-10-15T10:34:21.433 回答
1

除了 Acme 的回答之外,您可能不会修改 a string literal

看起来你循环通过str,增加到ii < strlen(str)但是,低于你去str+i+j。当 j 像 10 并且您处于 的最后时会发生str什么?您最有可能最终超出内存是因为str导致分段错误。

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

于 2013-10-15T10:39:03.993 回答