繁体   English   中英

在C中复制数组

[英]Copying arrays in C

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

我已经写了:

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时,它给了我一个堆栈溢出。

有任何想法吗?

有两个问题:首先,当使用printf打印字符串时,并且通常与其他标准C字符串函数一起使用时,您的char数组需要以空值结尾,以便函数知道字符串的结尾。 您还要在数组末尾写一个。

其次,在使用printf ,将要打印的字符串用作格式字符串几乎总是一个坏主意。 采用

printf("%s", array2);

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

您的字符串不是以Null结尾的,因此在打印字符串时,它将继续打印超过您分配的8个字符的字符,以寻找一个,但在此之前堆栈空间不足。 您还要写入一个比分配的字符更多的字符,并且您的条件应与&& “组合” && ,忽略第一个表达式的结果。 您还应该避免将字符串变量用作printf的字符串格式化程序。

这是您固定的代码:

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和带有i+索引array2来简化循环。 您也可以使用strncpy完全删除循环,但是请注意,如果n小于字符串的长度+ 1,则不会添加空终止符。

使用memcpy():

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

那更容易。

不必使用额外的array2

printf("%.8s",array1+1);

当您说printf(array2) ,它认为它正在打印一个以空值结尾的字符串。 由于array2 (可能)没有\\0 ,所以printf继续经过array2的末尾,这是不应该的,它会进入内存。

为了进一步扩展marcog的答案:您要声明具有1个元素(0-8)的array1,然后从0-9(10个元素)写入。 与array2相同。

只需使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM