1
A
回答
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
你能想到GLib
的g_strconcat()
功能嗎?這不是相當於同樣的事情:它需要一個NULL
- 終止的字符串列表,而不是簡單的兩個字符串。
在libc
中沒有將字符串連接成新分配的字符串的標準函數。
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現在當數據被複制時,甚至沒有對字符串末尾的隱式檢查。 –
相關問題
- 1. 返回一個字符串指針
- 2. 從函數返回一個字符串[字符指針]
- 3. 一個c程序,它返回一個指向2個字符串數組的指針
- 4. 字符串連接點到另一個字符串的指針C++
- 5. 指針結構沒有返回一個字符串
- 6. 針對每個類,並返回一個字符串和類
- 7. 聲明一個N指針數組返回指向函數的指針返回指向字符的指針
- 8. 使用指針的字符串連接
- 9. 指定一個字符串值指針
- 10. 返回一個指針
- 11. 返回一個字符串
- 12. 一個字符串指針的副本
- 13. 字符串連接使用指針
- 14. 與2個字符串的連接
- 15. 一個JavaScript數組的總和返回所有數字的字符串連接
- 16. 返回字符指針和字符串比較
- 17. 從兩個字符串數組中返回唯一字符串,連接成一個字符串VBA
- 18. 返回一個字符串和int
- 19. 連接一個字符串和一個空字符
- 20. 返回一個連接字符串在Haskell遞歸函數
- 21. 如何連接一個字符串返回到主要在JAVA
- 22. 從函數返回指針。值不更新爲一個指針
- 23. 2個字符串如何連接?
- 24. Java如何連接2個字符串?
- 25. 將一個字符串從一個指針複製到另一個指針
- 26. Ç - 返回一個字符指針沒有的malloc
- 27. 找到一個字符串,但返回前一個字符串
- 28. 錯誤的連接字符串返回
- 29. 字符指針和printf 2
- 30. C - If/Else和指針返回錯誤的字符串
strdup的扭曲記憶可能只是我的問題。 – jay
如果'first'和'second'指向重疊內存,'s1 + s2 + 1'可能會溢出。當然,在'size_t'小於'void *'的虛假拱形中。可能是明智的檢查。 :) –
@R ..:這是一個非常不可能的情況(你必須有一個大於地址空間一半的字符串),但理論上它是可能的,而且這是一個幾乎沒有花費的支票,所以我添加了它;注意's2 + 1'不能溢出,因爲'second'中數組的實際大小是's2 + 1'(因爲末尾有'\ 0'),並且C中的每個對象大小都保證是可由'size_t'表示。 –