在C中连接两个const char *

时间:2011-05-12 00:26:46

标签: c pointers char const concatenation

我正在使用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.
}

我认为最好的方法是创建一个临时变量来从缓冲区中获取数据,然后添加消息。完成后,将缓冲区指针重新分配给临时变量的引用(因为我尝试对函数进行最少量的更改,以减少编译错误的可能性)。

9 个答案:

答案 0 :(得分:4)

您无法附加到const char *。因为它是不变的。

答案 1 :(得分:2)

如果可以避免连接它们,请不要。例如,如果您要将它们作为输出发送,则只发送一个然后发送另一个。如果你想要连接它们,你需要真正使用C ++而不是像“C with crappy恼怒的限制”那样对待它,或者用C方式来做,这将涉及分配一个足够大的char数组来保存两个字符串并将它们复制到位(最好使用snprintf)。

无论你采用哪种方式,如果你想连接字符串,你必须分配内存,你必须为分配失败的可能性做好准备。

答案 2 :(得分:2)

大多数人都提到了两个问题。我将添加第三个:

  1. buffer指向const char,因此您无法写入。
  2. buffer按值传递,因此在函数外部不会显示重新分配它。
  3. 你不知道buffer有多大,所以如果你写了它,你可能会导致缓冲区溢出。
  4. 您可能想要的(未经测试的)是:

    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终止。

    如果您拒绝使用

    strlenstrcat,则无法实施。

答案 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现在将包含整个消息。