C拼接字符串变量字符串

4
我尝试按照以下方式连接字符串:"字符串",变量,"字符串";
#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, "这里是您的信,%s女士,欢迎光临!", name); 但是当我使用大段文本时,它非常困难。


5
Sprintf可以工作,但是Snprintf更好。 - stark
2
我发现了一个使用宏定义的“糖果”解决方案,即 #define NAME "Lannister" 和 **"Here you are Mrs. " NAME " Welcome!\r\n";**,但是我对宏定义不是很了解! - Isabel Cariod
对于一个常量值,使用宏是可以的。 - stark
4个回答

4
您只能使用"..." "..."表示法来表示在编译时可求值的常量表达式。由于name是运行时构造,因此您需要使用strcatsnprintf等函数来实现该功能。

4

如果名称在编译时已经确定,并且在运行时没有必要更改名称,那么请毫不犹豫地选择最简单的替代方案,即 -

#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.*/

1
预处理器可以为您执行字符串连接,只要所有涉及的字符串直接写在彼此之后并且它们是纯粹的常量字符串文字。也就是说,被" "包围的内容,而不是变量。例如,"hello" "world"将由预处理器更改为"helloworld"
这对于变量不起作用。如果您有字符数组,您需要使用运行时函数(如strcat)将它们连接起来。

1
作为使用“snprintf(NULL, 0, ...)”来确定为结果分配多少内存的的替代方案,您可以使用。但是,您需要负责分配足够的内存来容纳最终字符串!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接