簡體   English   中英

在C中連接字符串的安全方法是什么?

[英]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;
}

strcatstrncat

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.

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