請注意,當字符串作爲函數的參數傳遞時,會腐朽爲字符指針。並且在運行時不知道其指針給出的存儲區的大小。所以你mystr_concat
無法知道的dest
大小(除非你給大小在某種程度上,例如由顆粒尺寸在作爲附加功能放慢參數如聲明
void mystr_concat(char* dest, size_t destsize, char* src)
那麼你可能會如
char destbuf[36];
strncpy (destbuf, sizeof(destbuf) /*i.e. 36*/, "start");
mystr_concat(destbuf, sizeof(destbuf), "some-more");
叫它請注意,標準snprintf(3)函數有一個類似的約定。
另一種可能的方法是確定您的函數返回一個堆分配字符串,並且它的責任來電者到free
那個字符串。然後,你可以編寫
char *my_string_catenation (const char* s1, const char* s2)
{
if (!s1||!s2) return NULL;
size_t s1len = strlen(s1);
size_t s2len = strlen(s2);
char* res = malloc(s1len+s2len+1);
if (!res)
{ perror("my_string_catenation malloc"); exit(EXIT_FAILURE); };
memcpy (res, s1, s1len);
memcpy (res+s1len, s2, s2len);
res[s1len+s2len] = (char)0;
return res;
}
然後你可能會喜歡
char buf[32];
snprintf(buf, sizeof(buf), "+%d", i);
char* catstr = my_string_catenation((i>30)?"foo":"boo", buf);
do_something_with(catstr);
free(catstr), catstr = NULL;
上面的例子是有點笨代碼的事情,因爲人們可以只使用snprintf
無my_string_catenation
但我想不出一個短的更好的例子。
在C庫中,常見的有約定關於誰負責釋放一些堆分配的數據。你應該記錄這樣的約定(至少在聲明它們的頭文件中的註釋中)。
也許你可能有興趣使用Boehm's conservative garbage collector;您將使用GC_MALLOC
而不是malloc
等等,而您不會爲free
...
打擾您需要將最大目的地大小傳遞給您的功能,或者所有投注都關閉。 (和不相關的,你的第二個while循環可以簡單地爲'while((* dst ++ = * srC++));'並且你可以在末尾拋出空字符集。 – WhozCraig
http://www.openbsd.org/cgi-bin/man.cgi?query=strlcat - 基本上,做那個功能 – millimoose
@Dayalrai:在這裏使用'sizeof'是錯誤的建議。在指針上使用'sizeof'會返回指針變量的大小,而不是指針可能引用的數組的大小。 – alk