[英]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
)。
無論采用哪種方式,如果要連接字符串,都必須分配內存,並且必須為分配失敗的可能性做好准備。
大多數提到了兩個問題。 我將添加第三個:
buffer
指向const char,因此無法對其進行寫入。 buffer
是通過值傳遞的,因此重新分配它在函數外部將不可見。 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終止。
如果您拒絕使用strlen
和strcat
則實現起來很簡單。
我認為用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.