最后一句语句没有为什么会有乱码产生

第一种
#include
#include
void mcopy(char *s,char*t,int m);
int main(void)
{
char a[100],b[100];
int m;

gets(a);
scanf("%d",&m);
mcopy(a,b,m);
puts(b);

}
void mcopy(char *s,char*t,int m)
{
int len,i,d=0;
len = strlen(s);
for(i=m-1;i<len;i++)
{
t[d]=s[i];
d++;
}

} 第二种
#include
#include
void mcopy(char *s,char*t,int m);
int main(void)
{
char a[100],b[100];
int m;

gets(a);
scanf("%d",&m);
mcopy(a,b,m);
puts(b);

}
void mcopy(char *s,char*t,int m)
{
int len,i,d=0;
len = strlen(s);
for(i=m-1;i<len;i++)
{
t[d]=s[i];
d++;
}
t[d]='\0';
}

strlen(s)返回字符串中字符长度,不包含结束标志。所以最后要补一个。