因为C语言中,数组初始化时,如果给定的初始值个数小于数组长度,那么后面的剩余元素将被自动初始化为0,也就是字符串的结束标志'\0'
成都创新互联主营新河网站建设的网络公司,主营网站建设方案,成都App制作,新河h5重庆小程序开发公司搭建,新河网站营销推广欢迎新河等地区企业咨询
strcmp()函数就是用于查找两个以'\0'结束的字符串中的第一个不相同的字符的ASCII值之差,如果将数组长度改为5,那么strcmp函数在前5个字符中找不到结束标志,又因为程序不会对边界进行检查,所以会一直找下去,而此时,早已越界,所以会输出不可预见的结果。
strcpy(p+strlen(q),r);表示从数组首地址偏移strlen(q),也就是从元素d所在的位置开始复制
这时复制完后数组p的长度为3+5=8(元素d被覆盖)
strcat(p,q);表示从数组p的尾部进行连接,这时数组p的长度为8+3=11
而数组p在定义为char p[20],即请求连续开辟20个char类型存储单元,而每个char占一字节,所以sizeof(p)等于20
还有问题吗
字符串超长,fgets读了size-1个字符还没有读到'\n',就把已经读到的size-1个字符和一个'\0'字符存入字符数组,剩下的字符可以在下次调用fgets时继续读。
输入asdfasdfasdf123,第一次fgets只取走了前10个字符,余下的df123被下一次fgets取走了。
另外,还有两点:
1)包含的是系统头文件,建议用如下形式:
#include stdio.h
#include string.h
2)你这里fgets中size指定为11,而定义字符数组时,大小却为10,这样会溢出的。 你这里运行没问题是因为字符数组的数组名作参数时被自动转换为字符指针了。
基本上两种:字符数组和字符指针。字符数组名是常量,字符指针是变量
1、用字符数组:一个一维字符数组存储一个字符串,二维数组存储多个字符串。如:
int i;
char s1[]="abc",s2[][80]={"ABCD","XYZ"},s3[80];
scanf("%s",s3);
printf("%s,%s\n",s1,s3);
for(i=0;i2;i++)printf("%s\n",s2[i]);
2、用字符指针:字符指针指向一个字符串,字符指针数组处理多个字符串。如:
int i;
char *p1="abc",*p2[]={"ABCD","XYZ"},**p;
printf("%s\n",p1);
for(i=0;i2;i++)printf("%s\n",p2[i]);
p=p2;
for(i=0;i2;i++)printf("%s\n",*p++);
3、字符数组与字符指针配合一起使用:字符数组提供字符串的存储,处理字符串用字符指针
char s[80],*p;
p=s;
scanf("%s",p);
printf("%s",p);
在string.h中所有处理字符串函数,对字符数组和字符指针都适用。