字符串后的垃圾

Phl*_*das 0 c

我已编写代码将字符串复制到另一个字符串,但每个字符之间有一个空格.当我运行代码时,字符串后面有"垃圾".但是,如果最后的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)

sim*_*onc 5

这条线

cpy[strlen(cpy)] = '\0';
Run Code Online (Sandbox Code Playgroud)

因为cpy不是空终止所以将无法工作,因此strlen将读取超出结束,name直到它崩溃或找到零字节的内存.您可以通过将该行更改为来解决此问题

cpy[i*2] = '\0';
Run Code Online (Sandbox Code Playgroud)

如果在函数结束时取消注释for循环似乎可以解决问题,我只能猜测iprintf调用之前将其重置为0 ,这意味着printf在紧接着之后在堆栈上找到一个空终止符cpy.如果这是正在发生的事情,它的非常不确定的行为,所以不能依赖.