###字符數(shù)組的定義:有一定順序關(guān)系的若干個字符型變量的集合,就是字符數(shù)組。可以是一維的,也可以是多維的。字符數(shù)組具有普通數(shù)組的性質(zhì),又有一些特殊的性質(zhì);
###字符數(shù)組的初始化:
(1):和普通數(shù)組相同,逐個為數(shù)組元素賦值:
char ? ch[4]={'a','b','c','\0'};
(2):使用字符串常量來賦值:
char ? ch[10]={"abcdefghjk"};相當(dāng)于: char ?ch[10]={'a','b','c','d','e','f','g','h','j','k','\0'};
注意:用字符串來初始化字符數(shù)組,字符串結(jié)尾以“\0”結(jié)尾,上面只有10個字母,但字符串隱含了結(jié)束標(biāo)志\0,相當(dāng)于11個字母,越界了。
例:
#include#includeint main()
{
char ch[10] ={"abcdefghk"};
printf("%lu\n",sizeof(ch));
for (int i=0;i<sizeof(ch)/sizeof(char);i++)
printf("%c\n",ch[i]);
return 0;
}
此時ch[10]中包含了11個字母(多了 "\0"),所以程序會報錯,因?yàn)樵浇缫绯觯栽?char[]={“ ”}中只能存放9個字母;
###字符串
在C語言中,嚴(yán)格的講是沒有字符串的,不管是原生的還是構(gòu)造的數(shù)據(jù)類型,但是為何在程序員的心里是有字符串這個類型的,首先,我們知道C語言是一個面向過程的一門語言,而基于C語言更高級的語言O(shè)jective-C是面向?qū)ο蟮恼Z言,而在高級語言中有字符串這一類型,所以,在C語言中,程序員可以通過字符數(shù)組模擬字符串。字符串指的是以'\0'作為結(jié)束字符的一組字符,因此把一個字符串存入數(shù)組時,也把“\0”存入數(shù)組,并以此作為該字符串是否結(jié)束的標(biāo)志;
注意:字符串變量與一般的字符數(shù)組有一定的區(qū)別;
字符串常見處理函數(shù)
1.strlen(s)
頭文件:string.h
函數(shù)原型:size_t strlen(const char *s)
功能:求字符串的長度(不含字符串結(jié)束標(biāo)志'\0')。
參數(shù):s為字符串
返回值:字符串的長度(不含字符串結(jié)束標(biāo)志'\0')
strlen 函數(shù)測試字符串的實(shí)際長度(不包括'\0'),并將該長度作為函數(shù)的值返回。函數(shù)參數(shù)“字符串”可以使字符串常量,也可以是字符變量,一般形式:int ?length=strlen;
例:
#include <stdio.h>
#include <string.h>
int main()
{
char ch_1[ ]="abc\n";
char ch_2[ ]=" ";
printf("ABC的長度:%d\n",strlen("ABC"));
printf("ch_1的長度:%d\n",strlen(ch_1));
printf("ch_2的長度:%d\n",strlen(ch_2));
return 0;
}
結(jié)果:
ABC的長度:3
ch_1的長度:4
ch_2的長度:0
”abc\n“長度為4,而非5,‘\n’被看成一個字符。” “長度為0,是因?yàn)樗强兆址疀]有有效字符,所以長度為0;
2.strcpy(s1,s2)
頭文件:string.h
函數(shù)原型:char *strcpy(char *dest,const char *sre)
功能:字符串拷貝
參數(shù):src為源串的起始地址,dest為+目標(biāo)串的起始地址。
返回值:目標(biāo)串的起始值
strcpy函數(shù)用于實(shí)現(xiàn),iangge字符串的拷貝,一般形式:strcpy(字符串1,字符串2)
其中,字符串1必須是字符串變量,而不能是字符串常量。strcpy函數(shù)把字符串2的內(nèi)容完全復(fù)制到字符串1中,而不管字符串1中原先存放的是什么,復(fù)制后,字符串2保持不變;
例:
#include <stdio.h>
#include <string.h>
int main()
{
char str[10],str2[10];
strcpy(str,"abcdefg"); ?//將字符串常量拷貝給字符串變量str
strcpy(str2,str); //再將字符串變量str拷貝到字符串變量str2
printf("str:%s\n",str);
printf("str2:%s\n",str2);
return 0;
}
注意:由于字符串是字符數(shù)組,所以兩個字符串復(fù)制不通過賦值運(yùn)算進(jìn)行。
3.strcat(s1,s2)
頭文件:string.h
函數(shù)原型:char *strcat(cgar *dest,const char *src)
功能:把字符串src鏈接到字符串dest 后面
參數(shù):src為源串的起始地址,dest為目標(biāo)串的起始地址
返回值:目標(biāo)串的起始地址
strcat ?函數(shù)可以將兩個字符串鏈接起來,形成一個新的字符串。strcat函數(shù)的調(diào)用形式為:strcat(字符數(shù)組1,字符數(shù)組2);功能是將字符串2接到字符串1的后面
例:
#include <stdio.h>
#include <string.h>
int main()
{
char ? s1[50]="Good";
char ? ?s2[]="morning";
strcat(s1,s2);//鏈接字符串
printf("%s\n",s1);
return 0;
}
結(jié)果:Goodmoring
4.strcmp(s1,s2)
頭文件:string.h
函數(shù)原型:int ? ?strcmp(const ? char ?*s1,const ? ? char ? *s2)
功能:按照ASCII碼順序比較字符串s1和字符串s2的大小
參數(shù):s1為字符串起始地址,dest為目標(biāo)串的起始地址
返回值:比較結(jié)果
字符串1=字符串2,返回值=0;
字符串2>字符串2,返回值>0;
字符串2<字符串2,返回值<0;
字符串比較可使用strcmp函數(shù),strcmp函數(shù)的調(diào)用形式為:strcmp(字符串1,字符串2);
如果字符串1和字符串2完全相等,函數(shù)返回0;如果字符串1大于字符串2,函數(shù)返回一個正整數(shù);
如果字符串1小于字符串2,函數(shù)返回一個負(fù)整數(shù)。
字符串比較的規(guī)則是:將兩個字符串從左至右逐個字符按照ASCII碼進(jìn)行比較,直到出現(xiàn)不相等的字符或遇到‘\0’為止。若果所有字符都相等,則這兩個字符串相等。如果出現(xiàn)不相等的字符,以第一個不相等字符的比較結(jié)果為準(zhǔn)。
例:
#include <stdio.h>
#include <string.h>
int main()
{
? char s1[100],s2[100];
int i;
scanf("%s%s",s1,s2);
i=strcmp(s1,s2);
if(i==0)
{
printf("string1==string2");
}
else if(i>0)
{
printf("string1>string2");
}
else
{
printf("string1>string2");
}
printf("\n");
return 0;
}
5.strstr(s1,s2)
strstr(s1,s2) 函數(shù)收索一個字符串在另一個字符串中的第一次出現(xiàn)。如果匹配s2則返回首次出現(xiàn)s2位置的指針,否則則返回null。調(diào)用strstr函數(shù)的一般形式:strstr(被收索的字符串1,被收索的字符串search);
如果search為數(shù)字,則收索與數(shù)字匹配的ASCII碼值得字符
注意:該函數(shù)對大小寫敏感。如需進(jìn)行大小寫不敏感的收索,請使用stristr().
例:
#include <stdio.h>
#include <string.h>
int main()
{
char str[]="I like monkey,you like cat!";
char serch[]="like";
char *s=strstr(str,search);
printf("%s\n",s);
return 0;
}
運(yùn)行結(jié)果:Like monkey,you like cat!
6.strchr(s,c)
收索字符串s中首次出現(xiàn)字符c的位置。返回首次出現(xiàn)c的位置的指針,如果s中不存在c則返回null。
調(diào)用strchr的一般形式:strchr(被搜索的字符串s,被搜索的字符串c);
strchr和strchr用法一致,只是strstr是查找字符串,strchr是查找單個字符;