簡體   English   中英

在C中實現連接函數的問題

[英]Problems with implementation of concatenation function in C

我仍然是C中指針的新手,並且一直在嘗試創建字符串函數。 這個應該連接兩個字符串,但是當我嘗試運行它時,它會崩潰。

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

我究竟做錯了什么?

您正在嘗試訪問未初始化指針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;
}

請注意,函數不會更改傳遞給它的字符串,因此它們可以作為const傳遞。 size_asize_b應該等於strlen(a)strlen(b) ,這也意味着如果你總是將以null結尾的字符串傳遞給這個函數,你可以在它自己的體內計算它們的長度(所以你可以擺脫最后2個論點)。

e是未初始化的指針,這意味着它指向內存中的某個隨機位置。 當你開始寫它時,就好像它是一個指向字符數組的指針一樣,你的程序會崩潰(或者更糟糕的是,稍后改變某些狀態會導致未指定的行為)。

你的代碼似乎沒有理由混淆。 問題是你要分配給未初始化的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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM