我在用C语言工作,我必须把一些东西连接起来。

现在我有这个:

message = strcat("TEXT ", var);

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

现在,如果你有C语言的经验,我相信你会意识到,当你试图运行它时,这会给你一个分割错误。我该怎么做呢?


当前回答

如果你有C语言的经验,你会注意到字符串只是字符数组,其中最后一个字符是空字符。

现在这是相当不方便的,因为你必须找到最后一个字符,以追加一些东西。Strcat会帮你的。

所以strcat通过第一个参数搜索空字符。然后它将用第二个参数的内容替换它(直到它以null结束)。

现在让我们看一下你的代码:

message = strcat("TEXT " + var);

在这里,您向指向文本“text”的指针添加了一些内容(“text”的类型是const char*。一个指针)。

这通常是行不通的。此外,修改“TEXT”数组也将不起作用,因为它通常被放置在常量段中。

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

这可能会工作得更好,除非您再次尝试修改静态文本。Strcat没有为结果分配新的内存。

我建议这样做:

sprintf(message2, "TEXT %s TEXT %s", foo, bar);

阅读sprintf的文档,检查它的选项。

现在有一点很重要:

确保缓冲区有足够的空间容纳文本和空字符。有几个函数可以帮助您,例如strncat和printf的特殊版本,它们为您分配缓冲区。 不确保缓冲区大小将导致内存损坏和可远程利用的错误。

其他回答

不限制缓冲区大小的最佳方法是使用asprintf()

char* concat(const char* str1, const char* str2)
{
    char* result;
    asprintf(&result, "%s%s", str1, str2);
    return result;
}

如果你有C语言的经验,你会注意到字符串只是字符数组,其中最后一个字符是空字符。

现在这是相当不方便的,因为你必须找到最后一个字符,以追加一些东西。Strcat会帮你的。

所以strcat通过第一个参数搜索空字符。然后它将用第二个参数的内容替换它(直到它以null结束)。

现在让我们看一下你的代码:

message = strcat("TEXT " + var);

在这里,您向指向文本“text”的指针添加了一些内容(“text”的类型是const char*。一个指针)。

这通常是行不通的。此外,修改“TEXT”数组也将不起作用,因为它通常被放置在常量段中。

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

这可能会工作得更好,除非您再次尝试修改静态文本。Strcat没有为结果分配新的内存。

我建议这样做:

sprintf(message2, "TEXT %s TEXT %s", foo, bar);

阅读sprintf的文档,检查它的选项。

现在有一点很重要:

确保缓冲区有足够的空间容纳文本和空字符。有几个函数可以帮助您,例如strncat和printf的特殊版本,它们为您分配缓冲区。 不确保缓冲区大小将导致内存损坏和可远程利用的错误。

您正在尝试将字符串复制到静态分配的地址中。你需要进入缓冲地带。

具体地说:

剪断…

目的地

Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.

剪断…

http://www.cplusplus.com/reference/clibrary/cstring/strcat.html

这里也有一个例子。

请使用strncpy()、strncat()或snprintf()。 超过你的缓冲空间将会破坏内存中的任何东西! (并且记住要为尾随的空“\0”字符留出空间!)

字符串也可以在编译时进行连接。

#define SCHEMA "test"
#define TABLE  "data"

const char *table = SCHEMA "." TABLE ; // note no + or . or anything
const char *qry =               // include comments in a string
    " SELECT * "                // get all fields
    " FROM " SCHEMA "." TABLE   /* the table */
    " WHERE x = 1 "             /* the filter */ 
                ;