0

この関数を複数回実行すると、セグメンテーション違反が発生し、その理由がわかりません。文字列を分割する別の方法を探しているわけではありません。

SplitX は x 個の区切り文字 ('|' または '\0') の分割を続行し、x またはそれが作成できる部分文字列の数を返します。

簡単な JavaScript と PHP を 3 年間使用した後、C でのコーディングを再開したばかりなので、明らかな何かが欠けている可能性があることに注意してください。

int splitX(char **array, char *string, int x) {
    int y;
    int z;
    int index = 0;
    int windex = 0;
    for(y = 0; y < x; y++) {
        z = index;
        while(string[index] != '\0' && string[index] != '|') {
            index++;
        }
        char **tempPtr = realloc(array, (y+1)*sizeof(char *));
        if(tempPtr == NULL) {
            free(array);
            return -3;
        }
        array = tempPtr;
        array[y] = malloc(sizeof(char) * (index - z + 1));
        windex = 0;
        for(; z < index; z++) {
            array[y][windex] = string[z];
            windex++;
        }
        array[y][windex] = '\0';
        if(string[index] == '\0')
            break;
        index++;
    }
    return y+1;
}

int main() {
        char **array;
        int array_len = splitX(array, query, 2);
        printf("%s %s %d\n", array[0], array[1], array_len);
        while(array_len > 0) {
            free(array[array_len-1]);
            array_len--;
        }
        free(array);
        array_len = splitX(array, "1|2\0", 2);
        printf("%s %s %d\n", array[0], array[1], array_len);
        while(array_len > 0) {
            free(array[array_len-1]);
            array_len--;
        }
        free(array);
}
4

1 に答える 1

4
char **array;
int array_len = splitX(array, query, 2);

これにより uninitializedをsplitX()使用できるようになりarray、未定義の動作が発生します。

さらに、Cには参照渡しがありません-あなたが書くとき

 array = tempPtr;

関数の内部では、外部では目に見える効果はありません。

文字列を分割する別の方法を探しているわけではありません。

あなたは本当にそうあるべきです。あなたの現在のアプローチはせいぜい慣用的ではありませんが、他にもいくつかの間違いがあります(y + 1何らかの理由でy確実に戻るなど)。

また、車輪を再発明しています。文字列と文字の検索には、C 標準ライブラリの と を使用strstr()しますstrchr()。文字列を複製するには、手動で文字列を調べる代わりにstrtok_r()使用します。strdup()

ほかに何か:

  • size_tの代わりにサイズに使用しintます。

  • const char *入力文字列に使用して const の正確性を維持します。


char **split(const char *s, size_t *sz)
{
    char **r = NULL;
    size_t n = 0, allocsz = 0;
    const char *p = s, *t = p;
    int end = 0;

    do {
        const char *tmp = strchr(p, '|');
        if (tmp == NULL) {
            p = p + strlen(p);
            end = 1;
        } else {
            p = tmp;
        }

        if (++n > allocsz) {
            if (allocsz == 0)
                allocsz = 4;
            else
                allocsz <<= 1;

            char **tmp = realloc(r, sizeof(*r) * allocsz);
            if (!tmp) abort(); // or whatever, handle error
            r = tmp;
        }

        r[n - 1] = malloc(p - t + 1);
        memcpy(r[n - 1], t, p - t);
        r[n - 1][p - t] = 0;

        p++;
        t = p;
    } while (!end);

    *sz = n;
    return r;
}
于 2013-05-19T04:36:38.377 に答える