Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言复制数组_C_Arrays - Fatal编程技术网

用C语言复制数组

用C语言复制数组,c,arrays,C,Arrays,在我的C程序中,我试图将一个字符数组复制到另一个数组,同时删除第一个元素(元素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); chararray1[9]; char array2[8]; int i,j; 对于(i=1,j=0;i

在我的C程序中,我试图将一个字符数组复制到另一个数组,同时删除第一个元素(元素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);
chararray1[9];
char array2[8];
int i,j;
对于(i=1,j=0;i<10,j<9;i++,j++){
阵列2[j]=阵列1[i];
}
printf(array2);
当我打印array2时,它会导致堆栈溢出


有什么想法吗?

您的字符串不是以null结尾的,因此当它被打印时,它会继续打印超过您分配的8个字符,以查找其中一个字符,但在此之前堆栈空间不足。您写入的字符比分配的字符多,并且您的条件应与
&&
--a
组合,
忽略第一个表达式的结果。还应避免使用字符串变量作为
printf
的字符串格式化程序

这是您的代码:

chararray1[10]=“123456789”;
char array2[9];
int i,j;
对于(i=1,j=0;i<10&&j<9;i++,j++){
阵列2[j]=阵列1[i];
}
printf(“%s\n”,array2);

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

当您说
printf(array2)
时,它认为它正在打印空终止字符串。由于(可能)在
array2
中没有
\0
printf
继续运行到
array2
的末尾,游荡到内存中,这是不应该的。

进一步扩展marcog的答案:声明array1时包含9个元素,0-8,然后从0-9(10个元素)开始写入。array2也是这样

两个问题: 首先,当使用
printf
打印字符串时,通常使用其他标准C字符串函数时,字符数组需要以null结尾,以便函数知道字符串的结尾。在数组末尾还写入了一个

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

printf("%s", array2);
相反。如果您使用原始示例中的
printf
,并且array2可能会受到用户的影响,则您的程序可能容易受到格式字符串漏洞的攻击。

使用memcpy()

这更容易。

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

没有必要使用像这样的额外阵列2

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

你能初始化这样的循环吗?我只想为(I=0;iUmmm,C数组的第一个索引是0。最后一个索引是size-1。因此,当您分配
array2[8]
时,您的数组溢出了2。另外,您使用逗号运算符的条件是错误的,请记住逗号运算符会丢弃第一个值。您希望改为
&
。在C中,无论何时打印(非文字)字符串,并获得堆栈溢出,首先要检查的是字符串是否正确地被终止了。+ 1关于%s。一个泛型字符串的打印输出可以提供一个攻击向量,如果是“坏家伙”。可以提供字符串。他们可以将格式化字符放入字符串中,强制堆栈溢出,并可能执行自己的代码。或者,如果您不进行任何格式化,则可以使用
put()
(尽管我承认我通常使用
printf(“%s”,xxx)
).
strncpy
可能更好,如果可用,甚至可以使用
strlcpy
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);
printf("%.8s",array1+1);