在C++中向字符数组末尾添加内容

13

有没有一种命令可以将一个字符数组附加到另一个字符数组上?理论上会像这样工作:

//array1 has already been set to "The dog jumps "
//array2 has already been set to "over the log"

append(array2,array1);
cout << array1;

//would output "The dog jumps over the log";
这应该是一个相当容易实现的函数,我认为只是惊讶于没有内置的命令可以实现它。
*编辑*
我应该更清楚地表达,我的意思不是改变数组的大小。 如果array1设置为50个字符,但仅使用了其中10个字符,您仍将有40个字符可用。 我在考虑一种自动命令,可以实现以下效果:
//assuming array1 has 10 characters but was declared with 25 and array2 has 5 characters
int i=10;
int z=0;    
do{
    array1[i] = array2[z];
    ++i;
    ++z;
}while(array[z] != '\0');

我相当确定那个语法是可行的,或者类似的语法也可以。


C++ 中没有单一完整的类型“数组”。 - Kerrek SB
4个回答

18

如果你不允许使用C++的string类(我认为这是糟糕的教学C++),那么一个使用原始、安全数组的版本可能看起来像这样。

#include <cstring>
#include <iostream>

int main()
{
    char array1[] ="The dog jumps ";
    char array2[] = "over the log";
    char * newArray = new char[std::strlen(array1)+std::strlen(array2)+1];
    std::strcpy(newArray,array1);
    std::strcat(newArray,array2);
    std::cout << newArray << std::endl;
    delete [] newArray;
    return 0;
}

这可以确保你在连接字符串的数组中有足够的空间,而不需要假设某个预定义的MAX_SIZE。唯一的要求是你的字符串必须以空字符结尾,通常情况下都是这样的,除非你正在进行一些奇怪的固定大小字符串操作。

编辑后带有“足够缓冲区空间”假设的安全版本:

#include <cstring>
#include <iostream>

int main()
{
    const unsigned BUFFER_SIZE = 50;
    char array1[BUFFER_SIZE];
    std::strncpy(array1, "The dog jumps ", BUFFER_SIZE-1); //-1 for null-termination
    char array2[] = "over the log";
    std::strncat(array1,array2,BUFFER_SIZE-strlen(array1)-1); //-1 for null-termination
    std::cout << array1 << std::endl;
    return 0;
}

2
问题是将第二个数组附加到第一个数组,但您创建了一个新数组! - masoud
@MasoudM。原始问题陈述了需要添加两个char数组,没有明确要求重用数组。即使有此要求,这仍是一个不错的答案,因为“固定缓冲区大小”在C++中(实际上是在一般的原始数组中)根本不可行。我添加了一个更安全的版本以满足额外的要求。 - KillianDS
1
好的,你编辑了你的回答。但原始问题是:“是否有一条命令可以将一个char **数组附加到另一个char **数组上?” - masoud

5
如果您的数组是字符数组(似乎是这种情况),您需要使用strcat()。但是,您的目标数组应该有足够的空间来容纳附加的数据。
在C++中,最好使用std::string,然后您可以使用std::string::append()

1
@TaylorHuston:我也有这个怀疑,大多数与作业和任务相关的问题都有一些奇怪的规定,不允许使用C++的基础功能,而这就是我提供两种替代方案的原因。在这种情况下,你应该使用strcat()strncat()。请查看链接以获取使用详细信息。 - Alok Save
多年来,仍然没有人指出在嵌入式环境中使用字符串是有害的事实。而且有非常充分的理由支持这种观点。 - Craig.Feied

2

您需要为array1数组留足够的空间,并使用类似strcat的方法将array1array2连接起来:

char array1[BIG_ENOUGH];
char array2[X];
/* ......             */
/* check array bounds */
/* ......             */

strcat(array1, array2);

1
没有内置的命令可以做到这一点,因为那是非法的。一旦声明了数组,就无法修改数组的大小。
你要找的是要么使用 std::vector 模拟动态数组,要么更好的选择是使用 std::string
std::string first ("The dog jumps ");
std::string second ("over the log");
std::cout << first + second << std::endl;

你甚至不能在数组声明之前修改其大小。大小是类型的一部分。你所说的就像是说“你不能在声明后将int更改为float”。 - Kerrek SB
@KerrekSB 没有大小的数组类型是不完整的,但它仍然是一种类型。但是,在这种情况下,您可以在声明后修改大小:D。Luchian所说的似乎很清楚:一个定义良好的数组对象具有不可变的大小。 - Potatoswatter
@Potatoswatter:没错,我忘记了您确实可以使用extern声明不完整的类型,比如extern int a[];。说得好。(但是您无法修改其大小,只能指定其大小。也就是说,您只能推迟决策。) - Kerrek SB

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