2011-07-10 91 views
1

我不確定是否在做夢或者因爲我無法在任何地方找到這個函數。該函數調用2個字符串進行連接,然後將指針返回到一個新分配的2個字符串融合的內存塊。2個字符串和一個新指針的連接返回

有誰知道這樣的功能?

回答

3

我不知道C標準中的任何內容; POSIX C包含strdup,它返回提供的字符串的新分配副本,但這不是你要求的。

不過,你可以很容易地建立它自己:

char * strcat_alloc(const char * first, const char * second) 
{ 
    size_t s1=strlen(first), s2=strlen(second), stot=s1+s2+1; 
    // Length overflow check (see @R.. comment) 
    if(stot<s2+1) 
     return NULL; 
    char * ret = malloc(stot); 
    if(ret==NULL) 
     return NULL; 
    strcpy(ret,first); 
    strcpy(ret+s1, second); 
    return ret; 
} 
+1

strdup的扭曲記憶可能只是我的問題。 – jay

+0

如果'first'和'second'指向重疊內存,'s1 + s2 + 1'可能會溢出。當然,在'size_t'小於'void *'的虛假拱形中。可能是明智的檢查。 :) –

+0

@R ..:這是一個非常不可能的情況(你必須有一個大於地址空間一半的字符串),但理論上它是可能的,而且這是一個幾乎沒有花費的支票,所以我添加了它;注意's2 + 1'不能溢出,因爲'second'中數組的實際大小是's2 + 1'(因爲末尾有'\ 0'),並且C中的每個對象大小都保證是可由'size_t'表示。 –

1

你能想到GLibg_strconcat()功能嗎?這不是相當於同樣的事情:它需要一個NULL - 終止的字符串列表,而不是簡單的兩個字符串。

libc中沒有將字符串連接成新分配的字符串的標準函數。

+2

呀,這似乎越來越像一場夢。 – jay

+0

我不保證沒有這樣的功能;例如,GNU libc和FreeBSD libc都包含各種非標準函數,但我不記得具有您要求的確切功能。另一方面,它很容易實現爲'#define strdupcat(a,b)g_strconcat(a,b,NULL)'。 – geekosaur

0

檢查這個問題:Using strcat in C

此外,glib提供了很多的函數來處理字符串,如果你能負擔得起額外的依賴。

0

我不知道一個現成的貨架之一,但如何對這種淡然測試執行:

char* strdup_cat(char const* s1, char const* s2) 
{ 
    size_t siz1 = strlen(s1); 
    size_t siz2 = strlen(s2); 

    char* result = (char*) malloc(siz1 + siz2 + 1); 

    if (result) { 
     memcpy(result, s1, siz1); 
     memcpy(result + siz1, s2, siz2 + 1); 
    } 

    return result; 
} 
+0

如果你保存'strlen(s1)'的返回值,你可以避免'strcat'內的隱式'strlen'。 –

+0

@Matteo:好的。 FWIW現在當數據被複制時,甚至沒有對字符串末尾的隱式檢查。 –