在C中复制数组

时间:2011-01-14 18:34:02

标签: c arrays

在我的C程序中,我试图将一个char数组复制到另一个数组,同时删除第一个元素(元素0)。

我写道:

char array1[9];
char array2[8];
int i, j;

for(i = 1, j = 0 ; i < 10, j < 9; i++, j++){
        array2[j] = array1[i];
}
printf(array2);

当我打印array2时,它会给我一个堆栈溢出。

有什么想法吗?

7 个答案:

答案 0 :(得分:3)

两个问题: 首先,当使用printf打印字符串并且通常使用其他标准C字符串函数时,您的char数组需要以null结尾,以便函数知道字符串结束的位置。你也是在数组末尾写一个。

其次,使用printf时,使用要打印的字符串作为格式字符串几乎总是。使用

printf("%s", array2);

代替。如果您在原始示例中使用printf并且array2可能会受到用户的影响,则您的程序可能容易受到格式字符串漏洞的攻击。<​​/ p>

答案 1 :(得分:2)

你的字符串不是以空值终止的,所以当它打印出来时,它会继续打印超过你所分配的字符8,但在此之前用完了堆栈空间。您还要写一个比您分配的字符更多的字符,并且您的条件应与&&“合并” - ,忽略第一个表达式的结果。您还应该避免使用字符串变量作为printf的字符串格式化程序。

这是您的代码fixed

char array1[10] = "123456789";
char array2[9];
int i, j;
for(i = 1, j = 0 ; i < 10 && j < 9; i++, j++){
        array2[j] = array1[i];
}
printf("%s\n", array2);

您还可以使用单个索引变量i并使用array2索引i+来简化循环。您也可以使用strncpy完全删除循环,但请注意,如果n小于字符串+ 1的长度,则不会添加空终止符。

答案 2 :(得分:2)

使用memcpy():

memcpy( array2, &array1[1], 8 );

这更容易。

答案 3 :(得分:1)

没有必要使用像

这样的额外数组2
printf("%.8s",array1+1);

答案 4 :(得分:0)

当你说printf(array2)时,它认为它正在打印一个以空字符结尾的字符串。由于\0中(可能)没有array2printf会在array2的末尾继续,徘徊在记忆中它不应该。

答案 5 :(得分:0)

进一步扩展marcog的答案:你声明array1有9个元素,0-8,然后写0-9(10个元素)。与array2相同。

答案 6 :(得分:0)

只需使用strcpy()(如果它们都是字符串!)strcpy()想要指向源的指针和指向目标的指针。如果要跳过源数组的第一个元素,只需传递source + 1

char source[] = "ffoo";
char dest[] = "barbar";

strcpy(dest, source + 1);

// now dest is "foo" (since the ending \0 is copied too)

printf("\n%s\n", dest);