c指针数组

时间:2013-10-15 10:32:14

标签: c pointers

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

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

2 个答案:

答案 0 :(得分:1)

这个

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

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

使用此:

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

此外,您的分割功能也有无限循环。

答案 1 :(得分:1)

除了Acme的答案,您可能修改string literal

看起来您正在循环str,将i增加到i < strlen(str),但是,在str+i+j以下。当j像10并且你处于str的最后时会发生什么?最有可能最终走出内存的是str导致分段错误。

我建议您查看已包含的string.h。有一些功能可以更加安全地完成这项工作。