我正在使用C中的const char *
类型。由于我正在使用的库,我试图不使用或包含其他库(即cstring)。我正在使用的函数传递了const char *
类型的缓冲区。我想在这个缓冲区的末尾追加一条有限的消息。
例如:
functionA (const char *buffer){
char *message = "hello world";
//code appending message to the end of buffer
//buffer now contains its original contents plus "hello world" at the end.
}
我认为最好的方法是创建一个临时变量来从缓冲区中获取数据,然后添加消息。完成后,将缓冲区指针重新分配给临时变量的引用(因为我尝试对函数进行最少量的更改,以减少编译错误的可能性)。
答案 0 :(得分:4)
您无法附加到const char *
。因为它是不变的。
答案 1 :(得分:2)
如果可以避免连接它们,请不要。例如,如果您要将它们作为输出发送,则只发送一个然后发送另一个。如果你想要连接它们,你需要真正使用C ++而不是像“C with crappy恼怒的限制”那样对待它,或者用C方式来做,这将涉及分配一个足够大的char
数组来保存两个字符串并将它们复制到位(最好使用snprintf
)。
无论你采用哪种方式,如果你想连接字符串,你必须分配内存,你必须为分配失败的可能性做好准备。
答案 2 :(得分:2)
大多数人都提到了两个问题。我将添加第三个:
buffer
指向const char,因此您无法写入。buffer
按值传递,因此在函数外部不会显示重新分配它。buffer
有多大,所以如果你写了它,你可能会导致缓冲区溢出。您可能想要的(未经测试的)是:
char* functionA(char* buffer, size_t maxlen)
{
char *message = "hello world";
if(strlen(buffer) + strlen(message) >= maxlen)
return NULL;
return strcat(buffer,message);
}
两个字符串的长度必须小于maxlen才能允许nul终止。
如果您拒绝使用 strlen
和strcat
,则无法实施。
答案 3 :(得分:1)
我认为Concatenating strings in C, which method is more efficient?的答案,特别是Concatenating strings in C, which method is more efficient?,会有你想要的答案。
但是你需要稍微改变一下你的论点。您将无法在该示例中更改缓冲区,因为它已声明为const。
答案 4 :(得分:1)
您可以找到buffer []的结束位置,并将其用作message []副本的目标。对终端'\ 0'的字符串进行任何文本书扫描都可以,但是你要确保不要在缓冲区[]结束时运行。
这揭示了一个更大的问题。如果您不知道缓冲区是多么完整,并且您是否移动了额外的12个字符(计算结尾处自动提供的'\ 0')将导致缓冲区溢出,您需要一些方法来了解buffer []的容量是这样你的代码可以防御性地运行。
另外,尽管使const char * message = ...是安全的,但如果你想改变它,那么const char * buffer似乎有点奇怪。虽然C编译器可能无法捕获它,但它实际上违反了使用const char * buffer隐含的合同。此外,允许调用者在只读存储中实现buffer [],尽管我假设您是functionA的唯一用户。
因此,您可能希望了解如何更改参数列表并定义此函数的接口,以便它可以防止缓冲区溢出,错误初始化的缓冲区[]字符串等。
答案 5 :(得分:0)
尝试使用strcat()。 strcat
答案 6 :(得分:0)
const char
的要点是不变的 - 你不应该修改它。您必须将结果字符串放在新缓冲区中,如下所示:
char* combine (char *new_buffer, const char *buffer, const char *message)
{
return strcat(strcpy(new_buffer, buffer), message);
}
将字符串复制到新缓冲区,然后将消息连接到它。
答案 7 :(得分:0)
完成后,将缓冲区指针重新分配给临时变量的引用
这只会改变指向函数内部的缓冲区。传递给函数调用的指针不会被更改。
答案 8 :(得分:0)
我想如果你知道追加消息所需的内存,那么我们可以使用memcpy。
像...一样的东西。
main()的 { ...
u32 *new_ptr=NULL;
total_len=strlen(previous_msg)+strlen(appending_msg);
new_ptr=malloc(total_len);
memcpy(new_ptr,previous_msg,strlen(previous_msg));
memcpy(new_ptr+strlen(previous_msg), appending_msg, strlen(appending_msg));
... }
new_ptr现在将包含整个消息。