从数组复制 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::vector
或std::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::string
的 substr
。例如:
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++ 中,原始数组、原始指针和函数,如 strncpy
和 memcpy
通常很少见。 C++ 的主要优势之一是支持相对高级的抽象,而效率几乎没有损失。我建议使用它。
【讨论】:
【参考方案5】:在 C 语言中,您可以使用 memcpy
标准库函数。
【讨论】:
【参考方案6】:memcpy
或memmove
将一次性移动整个方块并消除循环。
【讨论】:
【参考方案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++的主要内容,如果未能解决你的问题,请参考以下文章