[英]What is a safe way to join strings in C?
我需要從兩個字符串構造一個文件的路徑。 我可以使用它(雖然沒有經過測試):
/* DON'T USE THIS CODE! */
/* cmp means component */
char *path_cmp1 = "/Users/john/";
char *path_cmp2 = "foo/bar.txt";
unsigned len = strlen(path_cmp1);
char *path = path_cmp1;
for (int i = 0; i < strlen(path_cmp2); i++) {
path[len + i] = path_cmp2[i];
}
但這可能會導致內存損壞。 有沒有更好的方法來做到這一點,或者標准庫中是否有這樣的功能?
#include <stdlib.h>
#include <string.h>
char *join(const char* s1, const char* s2)
{
char* result = malloc(strlen(s1) + strlen(s2) + 1);
if (result) // thanks @pmg
{
strcpy(result, s1);
strcat(result, s2);
}
return result;
}
這很簡單,可以編寫到位,特別是當你有多個字符串連接時。
請注意,這些函數返回其目標參數,因此您可以編寫
char* result = malloc(strlen(s1) + strlen(s2) + 1);
assert(result);
strcat(strcpy(result, s1), s2);
但這不太可讀。
#include <stdio.h>
char *a = "hello ";
char *b = "goodbye";
char *joined;
asprintf(&joined, "%s%s", a, b)
這段代碼有幾個問題:1 - 在for循環上調用strlen是個壞主意,它會在每次迭代時計算字符串長度,所以最好在循環之前調用它一次並將結果保存在變量中。
2 - 相同的strlen問題適用於循環內的strlen(path_cmp1),在循環之前調用它並遞增其大小。
最后,最好簡單地復制兩個字符串並將它們存儲在動態分配的字符串上,例如:
char *join_strings(const char* s1, const char* s2)
{
size_t lens1 = strlen(s1);
size_t lens2 = strlen(s2);
//plus 1 for \0
char *result = malloc(lens1 + lens2 + 1);
if(result)
{
memcpy(result, s1, lens1);
memcpy(result+lens1, s2, lens2+1);
}
//do not forget to call free when do not need it anymore
return result;
}
有strcat
和strncat
。
char *path_cmp1 = "/Users/john/";
char *path_cmp2 = "foo/bar.txt";
int firstLength = strlen(path_cmp1);
int secondLength = strlen(path_cmp2);
char *both = malloc(firstLength+secondLength+1);
memcpy(both, path_cmp1, firstLength);
memcpy(both+firstLength, path_cmp2, secondLength+1);
// this +1 copyes the second string's null-terminator too.
創建一個具有兩個輸入長度和strcpy / strcat輸入的新字符串,並且不要忘記空終止符。
使用strcat
。 (你的代碼會導致內存損壞,你說得對。)
string.h中的strcat
怎么樣?
path
只是指向path_cmp1
的指針,並且您嘗試訪問超出數組末尾的內容。 偶爾這會起作用,但在絕大多數情況下,你會導致內存損壞。
正如其他人指出的那樣,使用strcat
來連接字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.