从数组复制 C/C++

Posted

技术标签:

【中文标题】从数组复制 C/C++【英文标题】:C/C++ copy from array 【发布时间】:2013-12-19 16:28:15 【问题描述】:

我想从一个数组中复制一组字符,从一个索引复制到另一个。 例如,我有一个数组char array[64],我想从 5-15 中选择字符并将它们存储在另一个 char 数组中。 我可以用 for 循环来做到这一点,但是有什么函数可以做到这一点吗?就像 C# 方法 Substring 一样。提前致谢。

【问题讨论】:

使用std::copy?顺便说一句,这两种语言的问题效率不高。 如果您搜索strncpy() 和/或std::copy(),我很确定您会找到很多答案。 【参考方案1】:

您始终可以使用memcpy 来实现这一点,而且它会更有效。

char a[100] = 0;
char b[100] = 1;
memcpy(&a[10], &b[30], 10);

【讨论】:

这基本上是一个空操作。您将零复制到零。 这是一个非常 C 风格的解决方案(可能有疑问),但通常不会被认为是好的 C++ 代码。 @RichardPlunkett,为什么std::copy_n 会更好/不同? @Devolus。在这个特定的例子中,它有点不同,但如果你的数组是对象而不是 chars/scalars/pods 那么 memcpy 不起作用。我认为在始终有效的方案和不始终有效的方案之间进行选择时,始终有效的方案是更好的学习/使用方案。 @RichardPlunkett,所以std:copy_n 可以与std::vectorstd::string 一起使用?【参考方案2】:

C++:使用std::copy_n

#include <algorithm>

int main() 
    char a[100] = 0;
    char b[100] = 1;
    std::copy_n(&a[10], 10, &b[30]);

【讨论】:

【参考方案3】:

有几种方法。例如,您可以使用标准 C 函数 strncpy。例如

strncpy( dest, source + 5, 11 );

或者您可以使用标准 C++ 算法std::copy。例如

std::copy( source + 5, source + 16, dest );

或者你可以使用标准算法`std::copy_n。例如

std::copy_n( source + 5, 11, dest );

但如果你将使用 lambda 表达式,那么可用于此操作的标准算法集将会扩大。:)

【讨论】:

如果您在 char 5 之后,可能来源 +4?虽然是 11 点而不是 10 点的好地方 @Hiet,据我所知,初始索引是 5。【参考方案4】:

您确实提出了两个截然不同的问题,并且(到目前为止)您得到的大部分答案都集中在一个问题上。

他们回答的是如何在数组中复制字符。

然而,在你的问题结束时,你说:“就像 C# 方法 Substring。”

这确实指向了一个完全不同的方向:至少在 C++(但不是 C)中,最接近 C# 的子字符串的等价物是 std::stringsubstr。例如:

std::string a("12345678");

std::string b = a.substr(2,3); // b == 345

std::string 还提供了许多构造函数,可让您将一个字符串创建为另一个字符串的子字符串,因此您可以通过以下方式实现相同的效果:

std::string b = std::string(a, 2, 3);

我的直接建议:如果您要编写 C++,请编写真正的 C++。尤其是在语法相似的情况下,很容易将 C++ 视为带有一些额外花里胡哨的 C。

实际上,编写良好的 C++ 通常与编写良好的 C 完全不同。在良好的 C++ 中,原始数组、原始指针和函数,如 strncpymemcpy 通常很少见。 C++ 的主要优势之一是支持相对高级的抽象,而效率几乎没有损失。我建议使用它。

【讨论】:

【参考方案5】:

在 C 语言中,您可以使用 memcpy 标准库函数。

【讨论】:

【参考方案6】:

memcpymemmove 将一次性移动整个方块并消除循环。

【讨论】:

【参考方案7】:
#include <string.h>

char array[64];
char new_array[12]; /* 12th char for '\0' */

/* put some data into array */

/* copy chars 5-15 (11 chars) from array to new_array */
strncpy(new_array, &array[4], 11);

【讨论】:

请添加一些解释。 不适合我。有人将此标记为低质量,我只是建议您添加一些解释而不是关闭。无论如何,你选择。

以上是关于从数组复制 C/C++的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表中的元素复制到数组 c/c++

C / C ++如何复制没有嵌套循环的多维char数组?

数组的复制(test2.javatest3.java)

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

C/C++ 七大排序算法 之 “快速排序”

char* argv[] 如何在 c/c++ 中工作? [复制]