2016-09-30 99 views
1

我嘗試以下面的形式連接「string」,variable,「string」;C連接字符串變量字符串

#include <stdio.h> 

int main() { 
     char *name = "Lannister"; 

     char write_letter[50] = "Here you are Mrs. ", name, " Welcome!\r\n" 
          "Getting Started\r\n" 
          "Interviews\r\n" 
          "Take-home Projects\r\n"; 
} 

有沒有人有想法如何做到這一點?

我看到一個例子 sprintf(write_letter,「這是你太太的歡迎!」,name); 但是,當我使用大型文本時,這是非常困難的。

+5

sprintf的工作。 Snprintf更好。 – stark

+2

我發現了一個帶有宏的「糖」解決方案**#定義名稱「Lannister」**和**「在這裏,您是Mrs.」NAME「Welcome!\ r \ n」; **,但我不太瞭解宏! –

+0

對於一個常量值,使用宏很好。 – stark

回答

2

如果名字在編譯時已經決定,如果沒有必要在運行時更改名稱,然後通過各種手段選擇最簡單的替代方案,也就是 -

#define NAME "Lannister" 

char write_letter[] = "Here you are Mrs. " NAME " Welcome!\r\n" 
         "Getting Started\r\n" 
         "Interviews\r\n" 
         "Take-home Projects\r\n"; 

編譯最高級別的警告組。當你這樣做,你會 得到類似於「初始化字符串的字符串爲 太長」(這是由GCC產生的警告)類似的警告。 50對於 這個數組太小,因此我已經允許編譯器決定數組大小 (即'write_letter []')。

如果您需要在運行時改變字符串然後使用的strcat() -

char write_letter[150] = "Here you are Mrs. "; 
char *name = "Lannister"; 
char *write_letter_post = " Welcome!\r\n" 
          "Getting Started\r\n" 
          "Interviews\r\n" 
          "Take-home Projects\r\n"; 

strcat(write_letter, name); 
strcat(write_letter, write_letter_post); 
/*Use strncat() to prevent buffer overflow possibilities.*/ 

或sprintf的() -

char *_write_letter = "Here you are Mrs. %s Welcome!\r\n" 
         "Getting Started\r\n" 
         "Interviews\r\n" 
         "Take-home Projects\r\n"; 
char *name = "Lannister"; 
char write_letter[150]; 

sprintf(write_letter, _write_letter, name); 
/*Use snprintf() to prevent buffer overflow possibilities.*/ 
3

只能使用"..." "..."表示法編譯時可評估常量表達式。 Your's是一個運行時結構,由於name

您需要使用strcat,snprintf等。

1

預處理器能夠爲您進行字符串連接,因爲所涉及的所有字符串都是直接相繼寫入的,並且它們是純文本常量字符串文字。也就是說,被" "包圍的東西,而不是變量。例如,預處理器將"hello" "world"更改爲"helloworld"

這不適用於變量。如果您有字符數組,則需要將它們與運行時函數(如strcat)連接起來。

1

作爲sprintf的替代方法(使用snprintf(NULL, 0, ...)知道要爲結果分配多少內存),可以使用strcat。但是,你要負責分配足夠的內存來包含最終的字符串!