在我的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时,它会给我一个堆栈溢出。
有什么想法吗?
答案 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)
没有必要使用像
这样的额外数组2printf("%.8s",array1+1);
答案 4 :(得分:0)
当你说printf(array2)
时,它认为它正在打印一个以空字符结尾的字符串。由于\0
中(可能)没有array2
,printf
会在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);