0

私はまだ C のポインターに不慣れで、文字列関数を作成しようとしています。これは 2 つの文字列を連結することになっていますが、実行しようとするとクラッシュします。

void concatenate (char *a, char *b, int size_a, int size_b) {
    char *c, *d, *e;
    c = a;
    d = b;
    int i, j, k;
    int l = 1;

    for(i = 0; i<size_a; i++) {
        *(e+i) = *(c+i);
    }
    for (j = size_a; j<size_a+size_b; j++) {
        *(e+j) = *(d+(j-(j-l)));
        l++;
    }
    for (k = 0; k< size_a+size_b; k++){
        printf("%c",*(e+k));
    }
}

私は何を間違っていますか?

4

3 に答える 3

2

e初期化されていないポインタが指すメモリにアクセスしようとしているため、未定義の動作が発生します。

関数は次のようになります。

char* concatenate (const char *a, const char *b, int size_a, int size_b) {
    // create new string:
    char* newStr = malloc (size_a + size_b + 1);
    int i, j;

    // copy first string into it:
    for (i = 0; i<size_a; i++)
        newStr[i] = a[i];

    // copy second string into it:
    for (j = 0; j < size_b; j++)
        newStr[i + j] = b[j];

    newStr[i + j] = '\0';
    return newStr;
}

function は渡された文字列を変更しないことに注意してくださいconstsize_aandはandsize_bと等しいことが期待されます。これは、常に null で終わる文字列をこの関数に渡す場合、その本体内で独自に長さを計算できることも意味します (したがって、最後の 2 つの引数を取り除くことができます)。strlen(a)strlen(b)

于 2013-02-19T19:24:49.503 に答える
0

e は初期化されていないポインターです。つまり、メモリ内のランダムな場所を指しています。文字配列へのポインターであるかのように書き込みを開始すると、プログラムがクラッシュします (さらに悪いことに、不思議なことに状態が変化し、後で不特定の動作が発生します)。

于 2013-02-19T19:23:24.847 に答える
0

あなたのコードは理由もなく難読化されているようです。問題は、初期化されていない に割り当てていることですe。以下は、より読みやすい形式でe割り当てられたコードです。しかし、私はそれをテストしていません。

void concatenate (char *c, char *d) {    
    char *e; 
    e = calloc(strlen(c) + strlen(d) + 1, sizeof(char));
    int i, j;
    int l = 1;

    for(i = 0; c[i]; i++) {
        e[i] = c[i];
    }
    l = i;
    for (j = 0; d[j]; j++) {
        e[l + j] = d[j];
    }
    e[l + j] = '\0';

    printf("%s", e);

    free(e);
}
于 2013-02-19T19:30:44.407 に答える