因?yàn)镃語言中,數(shù)組初始化時,如果給定的初始值個數(shù)小于數(shù)組長度,那么后面的剩余元素將被自動初始化為0,也就是字符串的結(jié)束標(biāo)志'\0'
成都創(chuàng)新互聯(lián)主營新河網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,新河h5重慶小程序開發(fā)公司搭建,新河網(wǎng)站營銷推廣歡迎新河等地區(qū)企業(yè)咨詢
strcmp()函數(shù)就是用于查找兩個以'\0'結(jié)束的字符串中的第一個不相同的字符的ASCII值之差,如果將數(shù)組長度改為5,那么strcmp函數(shù)在前5個字符中找不到結(jié)束標(biāo)志,又因?yàn)槌绦虿粫吔邕M(jìn)行檢查,所以會一直找下去,而此時,早已越界,所以會輸出不可預(yù)見的結(jié)果。
strcpy(p+strlen(q),r);表示從數(shù)組首地址偏移strlen(q),也就是從元素d所在的位置開始復(fù)制
這時復(fù)制完后數(shù)組p的長度為3+5=8(元素d被覆蓋)
strcat(p,q);表示從數(shù)組p的尾部進(jìn)行連接,這時數(shù)組p的長度為8+3=11
而數(shù)組p在定義為char p[20],即請求連續(xù)開辟20個char類型存儲單元,而每個char占一字節(jié),所以sizeof(p)等于20
還有問題嗎
字符串超長,fgets讀了size-1個字符還沒有讀到'\n',就把已經(jīng)讀到的size-1個字符和一個'\0'字符存入字符數(shù)組,剩下的字符可以在下次調(diào)用fgets時繼續(xù)讀。
輸入asdfasdfasdf123,第一次fgets只取走了前10個字符,余下的df123被下一次fgets取走了。
另外,還有兩點(diǎn):
1)包含的是系統(tǒng)頭文件,建議用如下形式:
#include stdio.h
#include string.h
2)你這里fgets中size指定為11,而定義字符數(shù)組時,大小卻為10,這樣會溢出的。 你這里運(yùn)行沒問題是因?yàn)樽址麛?shù)組的數(shù)組名作參數(shù)時被自動轉(zhuǎn)換為字符指針了。
基本上兩種:字符數(shù)組和字符指針。字符數(shù)組名是常量,字符指針是變量
1、用字符數(shù)組:一個一維字符數(shù)組存儲一個字符串,二維數(shù)組存儲多個字符串。如:
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、用字符指針:字符指針指向一個字符串,字符指針數(shù)組處理多個字符串。如:
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、字符數(shù)組與字符指針配合一起使用:字符數(shù)組提供字符串的存儲,處理字符串用字符指針
char s[80],*p;
p=s;
scanf("%s",p);
printf("%s",p);
在string.h中所有處理字符串函數(shù),對字符數(shù)組和字符指針都適用。