2016-08-16 147 views
0

我想将一个数组分配给另一个数组。两个阵列不具有相同的尺寸:如何将字符数组分配给另一个字符数组中的另一个字符数组C

char array1[7] = "abcdefg"; 
char array2[3]; 

我怎样才能分配三(3)从ARRAY1值到阵列2?我试过这样:

array2[3] = {array1[2], array1[3], array1[4]}; 

和我倒是成为了以下错误消息:

expected expression before ´{´token 

我知道,我可以使用(memcpy())当阵列具有相同的大小。

我对VHDL和verilog有更多的经验。在VHDL中,它可能看起来像这样:

array2 := arry1(2 upto 4); 

但是我没有太多的C编程经验。

谢谢

+0

尺寸不同时使用'memcpy'有什么问题? – Kevin

+1

如果区域连续(不重叠),则可以使用'memcpy()':memcpy(array2,arrray1 + 2,3);' – MikeCAT

+0

仅仅因为你知道VHDL并不意味着问题就在于此。已移除标记。 – Olaf

回答

0

如果你希望做在运行时的副本,您可以使用memcpy()

memcpy(array2, array1 + 2, 3); 

或只写自己的副本循环:

for (int i = 0; i < 3; i++) array2[i] = array1[i + 2]; 

需要注意的是,这取决于周围的代码和你的C编译器和优化设置,这两种方法可能会也可能不会编译成相同的二进制文件。具体来说,优化编译器很可能既内联memcpy(),又将显式复制循环转换为对memcpy()的调用,具体取决于编译器认为最有效的方式。

另请注意,如果数组的类型不是char,则memcpy()的长度参数需要乘以元素类型的大小(以字节为单位)。但是,C标准保证sizeof(char) == 1

2

当你像你这样

只是这样做初始化array2[3],你可以复制的价值,

char array1[7] = "abcdefg"; 
char array2[3] = {array1[2], array1[3], array1[4]}; 
+0

'char array2 [] = {array1 [2],array1 [3],array1 [4]};'就足够了,因为你没有使用字符串初始值设定项。 –

+0

如果你定义像'array2 [3]'而不是'array2 []',这将不够用 – Berkay92

+2

如果你想要一个*字符数组*,如果你想要一个'string'就足够了,那么你需要空间为* nul终结者*。对于一个数组,你的答案是好的,我只是指出你可以将*数目的元素留空,编译器会设置它。所以底线,这取决于你打算如何使用'array2'。 –

0

这可以在Windows 7

#include <stdio.h> 
#include <string.h> 

int main() { 
    char array1[7] = "abcdefg"; 
    char array2[3]; 
    strncpy(&array2[0],&array1[2],3); 
    printf("%s\n",array2); 
} 

输出:

CDE

1

如果你确实指的是分配,那么你可以使用еру在头<string.h>申报标准功能strncpy

这里是一个示范项目

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char array1[7] = "abcdefg"; 
    char array2[4]; 
    size_t n = 3; 

    strncpy(array2, array1 + 2, n); 
    array2[n] = '\0'; 

    puts(array2); 

    return 0; 
} 

它的输出是

cde 

要考虑到,如果你想使阵列array2将包含一个字符串,那么它的尺寸应等于4〜存储三个复制的字符和终止零。

+0

请注意,如果strncpy()遇到空字节,它将停止。这就是你想要的,如果你正在使用以null结尾的字符串(因为这个答案似乎假设),但是如果你试图复制二进制数据(它可能包含空字节作为有效元素),那么你想'memcpy ()'而不是。 –

相关问题