【问题标题】:C concatenate string variable stringC连接字符串变量字符串
【发布时间】:2016-09-30 11:19:24
【问题描述】:

我尝试以以下形式连接“字符串”、变量、“字符串”;

#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); 但是当我使用大文本时非常困难。

【问题讨论】:

  • Sprintf 有效。 Snprintf 更好。
  • 我找到了一个带有宏的“糖”解决方案 #define NAME "Lannister""Here you are Mrs." NAME " Welcome!\r\n" ;,但是我对宏不太了解!
  • 对于常量值,使用宏就可以了。

标签: c concatenation string-concatenation


【解决方案1】:

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

#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";

编译时设置了最高警告级别。当你这样做时,你会 收到类似于“initializer-string for chars 的警告是 太长”(这是 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.*/

【讨论】:

    【解决方案2】:

    您只能将"..." "..." 表示法用于编译时可评估常量表达式。由于name,您的是一个运行时构造。

    为此,您需要使用strcatsnprintf 等。

    【讨论】:

      【解决方案3】:

      预处理器能够为您进行字符串连接,因为所有涉及的字符串都直接写在彼此之后并且它们是纯常量字符串文字。也就是" "包围的东西,不是变量。例如"hello" "world" 将被预处理器更改为"helloworld"

      这不适用于变量。如果您有字符数组,则需要将它们与运行时函数(例如strcat)连接起来。

      【讨论】:

        【解决方案4】:

        作为sprintf 的替代方案(使用snprintf(NULL, 0, ...) 了解为结果分配多少内存),您可以使用strcat。但同样,您有责任分配足够的内存来包含最终字符串!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-15
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          相关资源
          最近更新 更多