2016-09-30 98 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。但是,你要负责分配足够的内存来包含最终的字符串!