簡體   English   中英

我的“附加”算法或代碼有什么問題?

[英]What is wrong with my 'append' algorithm or code?

給出了2個字符串,第二個單詞將附加到第一個,第3個變量將存儲此字符串。 例如;

char *str1 = "abc";
char *str2 = "def";
char *str3 = "abcdef"; //should be

這是我的代碼,出現運行時錯誤:

#include <stdio.h>
#include <malloc.h>

void append(char *str1, char *str2, char *str3, int size1, int size2)
{
    int i=0;
    str3 = (char*) malloc(size1+size2+1);
    str3 = str1;

    while (str2[i] != '\0') {
        str3[i+size1] = str2[i];
        i++;
    }

    str3[size1+size2] = '\0';
}

int main() 
{
    char *str1 = "abc";
    char *str2 = "def";
    char *str3;

    append(str1, str2, str3, 3, 3);

    return 0;
}
str3 = (char*) malloc(size1+size2+1);
str3 = str1;

這是你的問題。 這樣做會將指針替換為從malloc到包含str1的指針的正確空間量。 保持循環設計不變,將其更改為:

str3 = malloc(size1+size2+1); 
for (int j = 0; str1[j] != '\0'; j++)
    str3[j] = str1[j];

另外,請參見有關在C中強制轉換malloc的結果的問題/答案: 是否可以強制轉換malloc 的結果?

代碼還有另一個問題。 您按值傳遞指針。 因此, malloc內的任何malloc都只會進行局部更改。 函數結束后,您的指針仍將指向舊值。 如果要更改它,則應將指針傳遞給該指針。 看一個例子:

#include <stdio.h>
char *c = "Second";
void assign(char *s) { s = c; }

int main() 
{
    char *str = "First";
    assign(str);
    printf("String after assign: %s\n", str);
    return 0;
}

運行該程序后,您將在控制台中看到“ First”。 正確的代碼是:

#include <stdio.h>
char *c = "Second";
void assign(char **s) { *s = c; }

int main() 
{
    char *str = "First";
    assign(&str);
    printf("String after assign: %s\n", str);
    return 0;
}
#include <stdio.h>
#include <stdlib.h> //to standard
#include <string.h>

char *append(const char *str1, const char *str2, int size1, int size2){
//parameter char *str3 is local variable.
//It is not possible to change the pointer of the original.
//str3 = str1;//<<-- memory leak
//str3[i+size1] = str2[i];//<<-- write to after str1(can't write!)

    char *str3 = (char*) malloc(size1+size2+1);
    memcpy(str3, str1, size1);//copy to alloc'd memory.
    memcpy(str3 + size1, str2, size2);//copy to after str1
    str3[size1+size2] = '\0';
    return str3;
}

int main(){
    char *str1 = "abc";
    char *str2 = "def";
    char *str3;

    str3 = append(str1, str2, 3, 3);
    printf("%s\n", str3);

    return 0;
}

暫無
暫無

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

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