簡體   English   中英

連接兩個字符串:C

[英]Concatenating two strings : C

考慮下面的代碼,用delimiter將兩個char arrays連接起來:

void addStrings(char* str1,char* str2,char del)
{
//str1=str1+str2
int len1=strlen(str1);
int len2=strlen(str2);
int i=0;
//char* temp=(char*) malloc((len1+1)*sizeof(char));
//strcpy(temp,str1);
str1=(char*) realloc(str1,(len1+len2+1)*sizeof(char));
printf("Here--%d\n",strlen(str1));
*(str1+len1)=del; //adding delimiter
for(i=0;i<=len2;i++)
    *(str1+len1+i+1)=*(str2+i);
printf("Concatenated String: %s\n",str1);
i=0;
    while( *(str1+i) != '\0')
    {
            printf("~~%d:%c\n",i,*(str1+i));
        i++;
    }

}

當使用addStrings("A","test",'@');運行此函數時addStrings("A","test",'@'); ; 代碼崩潰,因為下面的reallocgdb output

Breakpoint 3, addStrings (str1=0x40212f <_data_start__+303> "A", str2=0x40212a <_data_start__+298> "test",
    del=64 '@') at string.c:34
34      int len1=strlen(str1);
(gdb) s
35      int len2=strlen(str2);
(gdb) s
36      int i=0;
(gdb) s
39      str1=(char*) realloc(str1,(len1+len2+1)*sizeof(char));
(gdb)

Program received signal SIGABRT, Aborted.
0x004012f2 in addStrings (str1=0xc0 <Address 0xc0 out of bounds>,
    str2=0xea60 <Address 0xea60 out of bounds>, del=0 '\000') at string.c:39
39      str1=(char*) realloc(str1,(len1+len2+1)*sizeof(char));

無法弄清楚為什么它崩潰了? 是因為我將str1作為auto變量傳遞,而不是在heap創建它嗎?

如果是這樣的話? 如何修改代碼以接受auto變量和heap變量?

您需要按地址傳遞目標字符串指針,並且它必須保存先前分配的字符串的地址或NULL(如果編碼正確)。 大小分配必須為兩個長度+ 2(熟食分隔符一個,終止符一個)。 結果可能如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void addStrings(char** str1, const char* str2,char del)
{
    size_t len1 = *str1 ? strlen(*str1) : 0;
    size_t len2 = str2 ? strlen(str2) : 0;
    char *res = realloc(*str1, len1 + len2 + 2);
    if (res)
    {
        res[len1] = del;
        memcpy(res + len1 + 1, str2, len2);
        res[len1 + 1 + len2] = 0;
        *str1 = res;
    }
}

int main()
{
    char *p = NULL;
    const char test[] = "test";
    int i=0;

    // prove it works with no input whatsoever
    addStrings(&p, NULL, 'X');
    printf("p = %p, %s\n", p, p);

    // loop on some input for awhile
    for (;i<10;++i)
    {
        addStrings(&p, test, '@');
        printf("p = %p, %s\n", p, p);
    }
    free(p);
    return 0;
}

產量

p = 0x128610, X
p = 0x128610, X@test
p = 0x128610, X@test@test
p = 0x128620, X@test@test@test
p = 0x128620, X@test@test@test@test
p = 0x128620, X@test@test@test@test@test
p = 0x128620, X@test@test@test@test@test@test
p = 0x128640, X@test@test@test@test@test@test@test
p = 0x128640, X@test@test@test@test@test@test@test@test
p = 0x128640, X@test@test@test@test@test@test@test@test@test
p = 0x128670, X@test@test@test@test@test@test@test@test@test@test

編譯:Apple LLVM版本5.1(clang-503.0.40)(基於LLVM 3.4svn)目標:i386-apple-darwin13.2.0線程模型:posix

注意某些通行證中結果地址的變化。 我將檢查有效的參數輸入留給您作為練習。

暫無
暫無

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

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