我已编写代码将字符串复制到另一个字符串,但每个字符之间有一个空格.当我运行代码时,字符串后面有"垃圾".但是,如果最后的for循环被取消注释,则之后没有垃圾.任何人都知道为什么会这样吗?
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 20
main ()
{
char name[MAX_SIZE+ 1];
char cpy[(MAX_SIZE * 2) + 1];
gets(name);
int i = 0;
while (name[i] != '\0' && i < MAX_SIZE)
{
cpy[(i * 2)] = name[i];
cpy[(i * 2) + 1] = ' ';
i++;
}
cpy[strlen(cpy)] = '\0';
printf("%s\n", cpy);
//for (i = 0; i < strlen(cpy); ++i) {
// printf("%c", cpy[i]);
//}
}
Run Code Online (Sandbox Code Playgroud)
这条线
cpy[strlen(cpy)] = '\0';
Run Code Online (Sandbox Code Playgroud)
因为cpy不是空终止所以将无法工作,因此strlen将读取超出结束,name直到它崩溃或找到零字节的内存.您可以通过将该行更改为来解决此问题
cpy[i*2] = '\0';
Run Code Online (Sandbox Code Playgroud)
如果在函数结束时取消注释for循环似乎可以解决问题,我只能猜测i在printf调用之前将其重置为0 ,这意味着printf在紧接着之后在堆栈上找到一个空终止符cpy.如果这是正在发生的事情,它的非常不确定的行为,所以不能依赖.