当前位置: 首页 > 知识库问答 >
问题:

如何在C中复制一个char数组?

万明辉
2023-03-14

在C中,我有两个字符数组:

char array1[18] = "abcdefg";
char array2[18];

如何将array1的值复制到array2?我可以这样做吗:array2=array1


共有3个答案

赵志
2023-03-14

如果您想防止可能导致各种问题的非终止字符串,请像这样复制您的字符串:

char array1[18] = {"abcdefg"};
char array2[18];

size_t destination_size = sizeof (array2);

strncpy(array2, array1, destination_size);
array2[destination_size - 1] = '\0';

最后一行实际上很重要,因为< code>strncpy()并不总是以null结束字符串。(如果目标缓冲区太小,无法包含整个源字符串,则sntrcpy()不会以null终止目标字符串。)

strncpy()的手册页甚至声明“警告:如果src的前n个字节中没有null字节,则dest中的字符串将不会以null结尾。”

strncpy()表现出这种奇怪的方式,是因为它实际上并不是最初打算作为一种安全的复制字符串的方式。

另一种方法是使用snprintf()作为strcpy()的安全替代:

snprintf(array2, destination_size, "%s", array1);

(感谢jxh的提示。)

秦安宁
2023-03-14

如果您的数组不是字符串数组,请使用: memcpy(数组2, 数组1, 大小(数组2));

邓开济
2023-03-14
匿名用户

您不能直接执行< code>array2 = array1,因为在这种情况下,您操作的是数组的地址(< code>char *),而不是它们的内部值(< code>char)。

从概念上讲,您需要做的是遍历源(array1)的所有字符,并将它们复制到目标(array 2)。有几种方法可以做到这一点。例如,您可以编写一个简单的For循环,或者使用memcpy

也就是说,字符串的推荐方式是使用< code>strncpy。例如,它可以防止导致缓冲区溢出的常见错误(如果< code>array1是由用户输入(键盘、网络等)填充的,这将特别危险)。像这样:

// Will copy 18 characters from array1 to array2
strncpy(array2, array1, 18);

正如@Prof. Falken在评论中提到的,strncpy可能是邪恶的。确保您的目标缓冲区足够大以包含源缓冲区(包括字符串末尾的\0)。

 类似资料:
  • 问题内容: 我正在用Java编写密码,但不能做以下事情:我想编辑char数组的值来对其进行加密 我应该怎么做? 我不知道改变每个字符的ASCII值可能是答案。这就是为什么我问你们! 问题答案: 您可以在中添加一个,但结果是- 除非使用复合赋值运算符,否则必须将其转换回数组中: 要么 但是,通常这 不是 执行加密的适当方法。您通常会遇到无法打印的字符,甚至在Unicode中甚至没有特定含义的字符。取

  • 刚从C开始,我想知道是否有人能解释一些事情。 我相信你可以用下面的方法初始化一个字符数组 这将创建一个字符数组,其值为。 但如果我真的创造了这个: 会创建一个数组,以及指向该数组的指针吗? 例如:将指向内存中的第一个元素,以及数组中的其他元素?

  • 问题内容: 我想通过CGO将Go字符串复制到char *中。 我可以这样做吗? 问题答案: 根据cgo文档,您需要使用C.CString函数将Go字符串转换为C字符串: 请注意,C.CString函数为您分配了内存,但不会释放它,因此您有责任通过如下调用来释放内存:

  • 问题内容: 我想在MySQL中将数据从一个表复制到另一个表。 表1(现有表): 表2(新表) 我想将一些数据字段从表1复制到表2。 可以使用MySQL查询完成吗? 问题答案: 这将做您想要的: 如果要包括table1中的所有行。否则,如果只想添加table1的子集,则可以在末尾添加WHERE语句。 我希望这有帮助。

  • 我已经从网上搜索了很多,但不幸的是,没有一个奏效。如何将工作表从一个工作簿复制到另一个工作簿,使用C#在Excel中剪切和粘贴单元格值,错误:range类的Pastespecial方法失败。 知道为什么会这样吗?

  • 问题内容: 在不修改数组a地址的情况下,将数据从数组b复制到数组a的最快方法是什么。我需要这样做,因为外部库(PyFFTW)使用了指向无法更改的数组的指针。 例如: 是否可以不循环地进行? 问题答案: 我相信 将快速制作出深层副本。正如Funsi所提到的,最新版本的numpy也具有该功能。