用C语言复制数组
在我的C程序中,我试图将一个字符数组复制到另一个数组,同时删除第一个元素(元素0) 我写过:用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
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);