簡體   English   中英

在C中串聯兩個const char *

[英]Concatenating two const char * in C

我正在使用C中的const char *類型。由於使用的是庫,因此我試圖不使用或包括其他庫(即cstring)。 我正在使用的函數傳遞了const char *類型的緩沖區。 我想在此緩沖區的末尾附加一個有限的消息。

例如:

functionA (const char *buffer){
    char *message = "hello world";
    //code appending message to the end of buffer
    //buffer now contains its original contents plus "hello world" at the end.
}

我認為最好的方法是創建一個臨時變量以從緩沖區中接收數據,然后添加消息。 完成此操作后,將緩沖區指針重新分配給臨時變量的引用(因為我正在嘗試使用對函數的最少改動來完成此操作,以減少發生編譯錯誤的機會)。

您不能附加到const char * 因為它是恆定的。

如果有可能避免串聯它們,那就不要。 例如,如果要發送它們作為輸出,則只需發送一個然后發送另一個即可。 如果要連接它們,則需要真正使用C ++而不是將其視為“具有令人討厭的令人討厭的限制的C”,或者以C方式進行操作,這將涉及分配足夠大的char數組以容納字符串和復制將它們安裝到位(最好使用snprintf )。

無論采用哪種方式,如果要連接字符串,都必須分配內存,並且必須為分配失敗的可能性做好准備。

大多數提到了兩個問題。 我將添加第三個:

  1. buffer指向const char,因此無法對其進行寫入。
  2. buffer是通過值傳遞的,因此重新分配它在函數外部將不可見。
  3. 您不知道buffer有多大,因此,如果您確實對其進行寫操作,則可能導致緩沖區溢出。

您可能想要(未經測試)的是:

char* functionA(char* buffer, size_t maxlen)
{
    char *message = "hello world";
    if(strlen(buffer) + strlen(message) >= maxlen)
        return NULL;
    return strcat(buffer,message);
}

兩個字符串的長度必須小於maxlen以允許nul終止。

如果您拒絕使用strlenstrcat則實現起來很簡單。

我認為用C連接字符串的答案是哪種方法更有效? ,尤其是在C中連接字符串,哪種方法更有效? ,將提供您想要的東西。

但是,您需要確定一些更改。 在該示例中,您將無法更改緩沖區,因為該緩沖區已聲明為const。

您可以找到buffer []的結束位置,並將其用作message []副本的目的地。 盡管希望確保您不會在buffer []的末尾運行,但是對文本書中的終端'\\ 0'進行字符串掃描都可以。

這揭示了一個更大的問題。 如果您不知道緩沖區有多滿,又不知道額外的12個字符的移動(最后算上自動提供的'\\ 0')是否會導致緩沖區溢出,則需要某種方式來知道buffer []的容量可以使您的代碼具有防御性。

同樣,盡管使const char * message = ...是安全的,但是如果您打算更改const char * buffer似乎有些奇怪。 盡管C編譯器可能無法捕捉到這一點,但這實際上違反了使用const char * buffer所隱含的約定。 另外,盡管我假設您是functionA的唯一用戶,但允許調用者在只讀存儲中實現buffer []。

因此,您可能想看一下如何更改參數列表並定義此函數的接口,以便它可以防止緩沖區溢出,初始化不正確的buffer []字符串等。

我猜如果您知道附加消息所需的內存,那么我們可以使用memcpy。

有點像..

main(){...

u32 *new_ptr=NULL;
total_len=strlen(previous_msg)+strlen(appending_msg);
new_ptr=malloc(total_len);
memcpy(new_ptr,previous_msg,strlen(previous_msg));
memcpy(new_ptr+strlen(previous_msg), appending_msg, strlen(appending_msg));

...}

現在,new_ptr將包含整個消息。

嘗試使用strcat()。 strcat

const char的全部要點是恆定的-您不應該修改它。 您必須將結果字符串放置在新緩沖區中,如下所示:

char* combine (char *new_buffer, const char *buffer, const char *message)
{
    return strcat(strcpy(new_buffer, buffer), message);
}

這會將字符串復制到新緩沖區中,然后將消息連接到該緩沖區。

完成后,將緩沖區指針重新分配給臨時變量的引用

這只會更改函數內部指向的緩沖區。 傳遞給函數調用的指針將不會更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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