1.字符數(shù)組初始化 在C語言中,字符串是當(dāng)做字符數(shù)組來處理的;所以字符串有兩種聲明方式,一種是字符數(shù)組,一種是字符指針。 (1)直接逐個(gè)初始化字符數(shù)組:字符數(shù)組的初始化,最容易理解的方式就是逐個(gè)字符賦給數(shù)組中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 注意:如果花括號(hào)中提供的字符個(gè)數(shù)大于數(shù)組長度,則按語法錯(cuò)誤處理;若小于數(shù)組長度,則只將這些字符數(shù)組中前面那些元素,其余的元素自動(dòng)定為空字符(即'\0' )。 (2)用字符串常量來初始化字符數(shù)組:在c語言中,將字符串作為字符數(shù)組來處理。因此可以使用字符串來初始化字符數(shù)組。 char str[]={"I am happy"}; 也可以省略花括號(hào): char str[]="I am happy"; 但是,上述這種字符數(shù)組的整體賦值只能在字符數(shù)組初始化時(shí)使用,不能用于字符數(shù)組的賦值,字符數(shù)組的賦值只能對(duì)其元素一一賦值,下面的賦值方法是錯(cuò)誤的。 char str[]; str="I am happy";//錯(cuò)誤,字符數(shù)組的賦值只能按元素一一賦值(錯(cuò)誤的原因: C語言并沒有提供可以直接操作字符串的運(yùn)算符;“=”可以用于其他數(shù)據(jù)類型的賦值,但是不可以直接給字符串賦值。 這是字符數(shù)組初始化的兩種方式,但是這兩種方式其實(shí)是不等價(jià)的;他們的數(shù)組長度不同。 #include<stdio.h> int main() { char parr[] = "zifuchuanshuzu"; //與charr[]不等價(jià) char charr[] = { 'z','i','f','u','c','h','u','a','n','s','h','u','z','u' }; //等價(jià)于charr[] char charr_test[] = { 'z','i','f','u','c','h','u','a','n','s','h','u','z','u' ,'\0'}; int num_parr = sizeof(parr); int num_charr = sizeof(charr); int num_charr_test = sizeof(charr_test); printf("The parr[] is : %s\n", parr); printf("The size of parr[] is : %d\n\n", num_parr); //與charr[]不等價(jià) printf("The charr[] is : %s\n", charr); printf("The size of charr[] is : %d\n\n", num_charr); //等價(jià)于charr[] printf("The charr_test[] is : %s\n", charr_test); printf("The size of charr_test[] is : %d\n", num_charr_test); return 0; } 運(yùn)行結(jié)果: 從結(jié)果可以看到第二種初始化方式,打印的結(jié)果有問題,但是字符數(shù)量沒有問題。這是因?yàn)樽址J(rèn)是以’\0’結(jié)束的,第二種初始化方式中沒有’\0’,而我們以字符串方式打印,所以出錯(cuò); 第一種是系統(tǒng)自動(dòng)添加了’\0’;我們可以看到其字符數(shù)量是15(與第三種相同)。 (3)字符指針:在C語言中我們也可以使用字符指針來存儲(chǔ)字符串。 字符指針初始化: char* str="zifuchuanshuzu"; C語言對(duì)字符串常量是按照字符數(shù)組來處理的,在內(nèi)存中開辟了一個(gè)字符數(shù)組用來存放字符串常量,程序在定義字符串指針變量str時(shí),只是把字符串首地址賦值給str。 輸出: printf("%s\n",str); 系統(tǒng)首先輸出str指向的字符,而后自加1,直至遇到’\0’;與數(shù)組的輸出方式相同。 字符指針的賦值: char *str; str="zifuzhizhen"; 對(duì)于字符指針這種賦值方式是正確的。與字符數(shù)組不同。 2.字符串處理函數(shù):strcpy函數(shù)和strcat函數(shù) (1)char *strcpy(char *dest,const char*src); 頭文件:string.h和stdio.h 功能:將src地址開始且包含’\0’結(jié)束符的字符串復(fù)制到以dest開始的空間。 注: 字符數(shù)組dest必須是數(shù)組名形式,src可以是數(shù)組名也可以是字符串常量 可以用strcpy將src的前若干個(gè)字符復(fù)制到字符數(shù)組中. (2)char *strcat(char *dest,const char *src); 頭文件:string.h 功能: 把src中的內(nèi)容復(fù)制到dest結(jié)尾處(覆蓋’\0’)。 注: src和dest內(nèi)存區(qū)域不可以重疊,dest必須有足夠的空間來容納src; 字符數(shù)組dest必須是數(shù)組名形式,src可以是數(shù)組名也可以是字符串常量; 返回指向dest的指針; #include<stdio.h> #include<string.h> int main() { //利用strcpy為字符數(shù)組賦值 char parr[40]; strcpy(parr,"zifuchuanshuzu"); printf("The parr[] is : %s\n\n", parr); //賦值字符串的一部分 char charr[] = "_test_strcat_redundance"; char tarr[13]; charr[12] = '\0'; //復(fù)制charr的前12個(gè)字符 strcpy(tarr, charr); printf("The tarr[] is : %s\n\n", tarr); //字符串鏈接 strcat(parr, charr); printf("The parr and tarr[] is : %s\n", parr); return 0; } 結(jié)果: 3.總結(jié) (1)在C語言中并沒有直接提供字符串的操作,其字符串操作是通過轉(zhuǎn)化為字符串完成的,例如字符數(shù)組,字符指針,其本質(zhì)是對(duì)字符的操作。 (2)作為字符數(shù)組,與普通數(shù)組相同,區(qū)別在于它的每一個(gè)元素是一個(gè)字符,所以不可以直接用“=”對(duì)字符數(shù)組賦值(parr[]=”zhifushuzu”,是錯(cuò)誤的賦值方式),但是可以對(duì)每一個(gè)元素進(jìn)行賦值(charr[12]=’\0’是正確的)。 (3)字符串一定是以’\0’結(jié)尾的;字符數(shù)組和字符指針我們當(dāng)做字符串整體初始化,系統(tǒng)會(huì)自動(dòng)添加’\0’;對(duì)于字符數(shù)組,如果采用單個(gè)字符的方式進(jìn)行初始化或者賦值一定要考慮結(jié)束符’\0’. (4)strcpy和strcat內(nèi)部也是對(duì)字符的操作,以‘\0’作為字符串結(jié)束的標(biāo)志。 |
|