一个小的C程序的有关问题和疑惑

一个小的C程序的问题和疑惑
void combineArray(char *a,char *b,char *c);
int main(){char x[30]="abcdefg";
char y[30]="123";
char z[30]="";
//char *i;
/*printf("please input a string:\n");
scanf("%s",x);
printf("please input a string:\n");
scanf("%s",y);
*/
combineArray(x,y,z);
//i=z;
/*while(*i!=NULL)
{
printf("%c",*i);
i++;
}
*/
printf("%s\n",z);}void combineArray(char *a,char *b,char *c)
{
while(*a!=NULL)
{
*c = *a;
//printf("c:%c\n",*c); //显示c此时的内容
a++;
c++;
}
while(*b!=NULL)
{
*c = *b;
//printf("c:%c\n",*c); //显示c此时的内容
b++;
c++;
}
}

如果预先对字符数组赋值的话程序毫无问题,能正常输出。但是如果我实现不对数组赋值,而是用键盘输入的方式来得到数组的值。结果不管是用printf("%s\n",z);还是用while循环输出,都会显示结果尾部有乱码。注释掉的代码是我的尝试。求解
c语言 数组 指针

------解决方案--------------------
char x[30];
char y[30];
char z[30];
如果你不直接初始化这几个字符数组,那这些数组的值就是一些垃圾值了。输出尾部自然就是乱码了。你不初始化的话也要把这些数组清0了再scanf输入