C语言习题的疑问

来源:百度知道 编辑:UC知道 时间:2024/06/18 18:11:54
#include<stdio.h>
main()
{char a[80],b[40],i=0,j;
printf("输入a数组");
gets(a);
printf("输入b数组");
gets(b);
while(a[i]!='\0')
i++;
for(j=0;b[j]!='\0';i++)
{a[i]=b[j];
j++;}
a[i]='\0';
for(i=0;i<=80&&a[i]!='\0';i++)
printf("%c",a[i]);
}
这道题只这样的不用strcat函数让b放到a数组中
为什么要让a[i]='\0';呢?
如果没有这个步骤
我这样运行的
输入asd
asd
输出的是asdasd(
哪个(是怎么出来的?

你怎么把i,j定义成字符变量勒?应该是int i=0,j;

c/c++中规定字符串的结束标志是'\0',只是它不计入字符串的长度,但是会占内存空间,占a[i]最后的一个字节。所以只有在a[i]的最后加上结束标志'\0',在打印输出的时候,编译器才知道到’\0‘时该字符串已经结束不用再输出了,否则会输出内存中排在a[i]后面的下一个字节内的数据,而这个数据已是字符串a[i]范围之外或者是a[i]里面无效的部分(即80字节内'\0'后的部分,此时a[i]足够长),在a[i]外的数值是随机的,可能是乱码。在a[i]范围内的也是随机数值,因为你开始在定义a[i]的时候只是给了它80个字节长度,没有初始化,里面的内容是随机的。

如果没有最后的那个 a[i]='\0'; ,字符串就会没有结束标记,然后输出时就会输出错误。无论输出时出现什么奇怪的字符,都会是正常的反应。