2013-12-19 63 views
0

我想從一個數組中複製一組字符,從一個索引到另一個。 例如我有一個數組char array[64],我想從5-15中選擇字符並將它們存儲在另一個字符數組中。 我可以用for循環來做到這一點,但是有沒有什麼功能可以做到這一點?像C#方法Substring一樣。提前致謝。從陣列的C/C + +副本

+1

使用'std :: copy'?順便說一下,這些雙語問題並不是很有成效。 – juanchopanza

+1

如果您搜索'strncpy()'和/或'std :: copy()',我很肯定你會找到很多答案。 –

回答

4

您總是可以使用memcpy來實現這一點,無論如何它會更有效率。

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

這基本上沒有任何操作。您將零複製到零。 – juanchopanza

+0

這是一個例子,不是生產代碼。 – Devolus

+0

這是一個非常C風格的解決方案(可能有問題保證),但它通常不會被認爲是很好的C++代碼。 – RichardPlunkett

0

在C中,您可以使用memcpy標準庫函數。

0

memcpymemmove將一次移動整個塊並消除循環。

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]); 
} 
0
#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); 
+0

請添加一些解釋。 – DontVoteMeDown

+0

有什麼更清楚的嗎? – bph

+0

這不是我。有人將此標記爲低質量,我只是建議您添加一些解釋而不是關閉。無論如何,你選擇。如果你是char 5之後, – DontVoteMeDown

1

有幾種方法。例如,您可以使用標準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表達式,然後可以使用此操作的一套標準算法將被放大。:)

+0

也許是源代碼+4? 11點而不是10點的好位置 – bph

+0

@Hiet,據我瞭解,初始指數是5. –

+0

是的 - 也許OP不太清楚 – bph

1

你真的問了兩個完全不同的問題, (到目前爲止)你所得到的大部分答案都只專注於一個答案。

他們回答的是如何複製數組中的字符。

然而,在您的問題結束時,您會說:「就像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++的主要優勢之一是支持相對較高級別的抽象,而且效率很低或沒有懲罰。我建議利用它。