C++ C字符串總結(jié)_第1頁
C++ C字符串總結(jié)_第2頁
C++ C字符串總結(jié)_第3頁
C++ C字符串總結(jié)_第4頁
C++ C字符串總結(jié)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、字符數(shù)組和字符串       &字符數(shù)組和字符串的概念  &字符數(shù)組的初始化  &字符串的輸入輸出  &綜合舉例  字符數(shù)組和字符串的概念     字符數(shù)組是元素類型為字符的數(shù)組 ,它既具有普通數(shù)組的一般性質(zhì) ,又具有某些特殊性質(zhì)。     字符串常量是用雙引號包圍的字符序列。存儲字符串常量時,系統(tǒng)會在字符序列后自動加上 '0',標志字符串的結(jié)束。字符串的長度定義為字符串中的有效字符數(shù),不包括結(jié)束標

2、志 '0'和雙引號。     字符串變量是以 '0'作為結(jié)束標志的字符數(shù)組。字符串變量用于存儲和處理字符串常量。在書中統(tǒng)稱為字符串的,既可能是字符串常量也可能是存儲了字符串常量的字符串變量,即特殊的字符數(shù)組。      字符數(shù)組有兩種用法 :一是當作字符的數(shù)組來使用。這時的用法與整數(shù)的數(shù)組、   實數(shù)的數(shù)組等相同,對字符數(shù)組的輸入、輸出、賦值、引用等都是針對單個的元素進行。二是更為重要的用法即存儲、處理字符串。這時它除了可以像普通數(shù)組一樣使用外,還可以把字符串作為一個整體進

3、行操作。  字符數(shù)組的初始化  (1用字符對字符數(shù)組初始化   這時把字符數(shù)組當作普通數(shù)組看待 ,  產(chǎn)生的數(shù)組不會有結(jié)束符 '0'。當數(shù)據(jù)量很大時,使用這種方法的工作量是繁重的。     例: char rat5='H','E','L','L','O' (2用字符串常量對字符數(shù)組初始化 ,這時把字符數(shù)組當作字符串變量看待。     例: char panic6="HELLO&qu

4、ot;     這時存放在數(shù)組 panic中的字符除了 H,E,L,L,O之外還有結(jié)束標志 '0',因此與下面的初始化等價:     char panic6='H','E','L','L','O'     注意 :  第二個說明語句中有 6  個字符 ,  因此字符數(shù)組 panic  的長度是 6,  而字符串 "HELLO"的長度卻是 5,

5、不把 '0'計算在內(nèi)。     C語言也允許在用字符串初始化時省略花括號。     char panic="HELLO"     如果在說明語句中指定了數(shù)組的長度,那么其大小不得小于初始化字符串的長度。多余的元素位置被系統(tǒng)自動初始化為 0。實際上 '0'就是 ASCII碼為 0的字符 ,因此 '0'和整數(shù) 0是一回事。     例: char posia11="string" 下面的初始化

6、卻是錯誤的 :     char neg5="double arrow" /*初始化數(shù)據(jù)太多 */ 3字符數(shù)組兩種不同用法舉例     在前面已經(jīng)說明 ,字符數(shù)組既可當作普通數(shù)組使用也可用于存儲和處理字符串 .下面是對應兩種用法的例子。 例 :  字符數(shù)組用法示例之一 ,當作普通數(shù)組。 #include #define SIZE 10 main( char ary1SIZE='P','L','O','T' char ary2SIZE; cha

7、r ch; int i,j; for(i=0;i<4;i+ /*輸出數(shù)組 ary1*/ printf("%c",ary1i; printf("n請輸入一行字符 n" for(i=0;i 輸入數(shù)組 ary2*/ scanf("%c",&ch; if(ch='n' break; ary2i=ch; printf("n" for(j=0;j 輸出數(shù)組 ary2*/ printf("%c",ary2j; 程序中為了處理數(shù)組使用了循環(huán) ,并且使用了 ch,i,j等工作變量 ,

8、增加了程序的負擔 ,而且又缺乏靈活性 ,故這種方法很少使用。與下面完成同樣功能的程序相比,本程序復雜多了。 例 :  字符數(shù)組用法之二 ,當作字符串。 #include #define SIZE 10 main( char ary1SIZE="PLOT" char ary2SIZE; printf("%sn",ary1; /*輸出數(shù)組 ary1*/ printf("請輸入一行字符 :n" scanf("%s",ary2; /*輸入數(shù)組 ary2*/ printf("輸入字符串是 :n"

9、 printf("%s",ary2; /*輸出數(shù)組 ary2*/       程序沒有用循環(huán) ,只是直接調(diào)用 scanf和 printf函數(shù)完成輸入輸出。程序之所以能夠自動識別出字符串有幾個字符,是因此規(guī)定了字符串必須以 '0'作為結(jié)束 ,  像 printf之類的函數(shù)輸出字符串時一邊檢測一邊輸出 ,一旦碰到 '0',便認為字符串已經(jīng)結(jié)束 ,之后就停止工作。這樣一來 '0'對整個字符串來說至關(guān)重要了。一旦由于某種原因字符串的 '0'被改為別的值 ,字符

10、串就無法終止 ,printf函數(shù)就不能正常工作了。      請注意 printf和 scanf函數(shù)處理字符串數(shù)組的特點。直接使用數(shù)組名作為參數(shù)。 例: printf("%sn",ary1;     這種直接使用數(shù)組名的用法表示把字符串數(shù)組當作一個統(tǒng)一整體來處理,只適用于字符串,對別的類型的數(shù)組是不能這樣用的。  字符串的輸入輸出   字符串的輸入     字符串輸出      

11、;  字符串處理函數(shù)        scanf 函數(shù)     用帶 %s格式符的 scnaf函數(shù)可以進行字符串的輸入。在使用中要注意兩個問題:一是 scanf函數(shù)讀入的字符串開始于第一個非空白符,包括下一個空白符 (' n','t',''之前的所有字符,最后自動加上 0'。     例: char str10;         sc

12、anf("%s",str;     輸入: hello world     實際存入 str的只有 "hello",前面的空格被忽略掉,而 "world"被留在輸入緩沖區(qū)中等待下一次輸入函數(shù)的讀入。 二是要保證字符數(shù)組的長度足夠大 ,能容納下可能的最大輸入串。     例: char t5,s10;         scanf("%s",t;  &

13、#160;  輸入 :dingdong 則字符串 "dingdong"不僅存入了 t的空間 ,還侵占了 s的空間。  gets 函數(shù)     gets函數(shù)專門用于輸入字符串 ,一般形式是 :         gets(字符數(shù)組名 ;     其中 ,  函數(shù)參數(shù) "  字符數(shù)組名 "  規(guī)定了只能使用數(shù)組名而不能是字符串常量。與 scanf函數(shù)不同 ,gets函數(shù)將用戶鍵入的換

14、行符之前的所有字符 (包括 't'和 ''存入字符數(shù)組 ,然后加上 '0',但換行符被丟掉。與 scanf函數(shù)相同的是 gets  函數(shù)也不檢查用戶輸入字符串長度是否超過了字符數(shù)組的容納能力,因此編程者要確保數(shù)組足夠大。     例: char str11;         gets(str;     輸入 :I am a boy  字符串輸出   printf 函數(shù)  

15、;   用帶 %s格式字符的 printf函數(shù)能進行字符串的輸出。存放在字符數(shù)組中的字符串被全部輸出,直至遇到 '0'為止。     例: char msg="T0 be or not to be"         printf("%s",mag;  puts 函數(shù)     puts函數(shù)專門用于字符串輸出。一般形式是:      &

16、#160;  puts(字符串 ;     其中 ,  參數(shù) "  字符串 "  可以是字符串常量 ,  也可以是字符串變量。 puts函數(shù)打印字符串的全部內(nèi)容 ,直至遇到 '0'為止 ,然后自動多打印一個 'n',起到換行的作用。而 printf函數(shù)無此功能。      到底應該使用 scanf和 printf還是使用 gets和 puts,沒有一個絕對的標準。一般而言,當多種類型的混合輸入輸出時,選用 scanf和 pr

17、intf;   當大量文字信息輸入輸出時,使用 gets和 puts,這兩個函數(shù)要稍稍快一些。  字符串處理函數(shù)       介紹最有用又最常見的四個字符串處理函數(shù): strlen、 strcat、 strcmp、 strcpy。這些函數(shù)的原型存放在 string.h文件中,在程序中使用它們時別忘了用 #include命令包含 string.h文件。  strlen 函數(shù)     strlen函數(shù)測試字符串的實際長度(不包括 '0'),并將該長度作為函數(shù)的值返

18、回。函數(shù)參數(shù)“字符串”可以是字符串常量,也可以是字符變量一般形式是:     length=strlen(字符中) 例: "ABC"  長度為 3。         "abcn"  長度為 4,而非 5,'n'被看成一個字符。         ""  長度為 0,空字符串沒有有效字符 ,所以長度為 0。  str

19、cat 函數(shù)     strcat函數(shù)用于連結(jié)兩個字符串。一般形式是:         strcat(字符串 1,字符串 2;     strcat函數(shù)把字符串 2連結(jié)在字符串 1的后面。其中,參數(shù)“字符串 1"必須是字符串變量 ,而 "字符串 2"則可以是字符串常量或變量。     調(diào)用 strcat函數(shù)后, str1中字符后的 '0'取消,只在新串最后保留一個'0'。 注

20、意 : strcat函數(shù)不檢查字符串 1的空白位置是否裝得下字符串 2。如果沒有足夠的空間,多余的字符將溢出至鄰近的內(nèi)存單元,破壞這些單元原來的內(nèi)容。所以連結(jié)前應調(diào)用 strlen函數(shù)進行檢驗,確保不發(fā)生溢出。記住在檢驗時給長度加,為新字符串的結(jié)束符 '0'留一個位置。 例 :  strcat函數(shù)示例。      static char str130="Pelple's Republic of "/*注意空格*/      static char str2=&q

21、uot;China"      printf("%s",strcat(str1,str2; 輸出:      Pelple's Republic of China  strcmp 函數(shù)     strcmp函數(shù)是比較兩個字符串的大小 ,返回比較的結(jié)果。一般形式是:         i=strcmp(字符串,字符串 ;     其中,字符串、

22、字符串均可為字符串常量或變量; i  是用于存放比較結(jié)果的整型變量。比較結(jié)果是這樣規(guī)定的: 字符串 1小于字符串 2,strcmp函數(shù)返回一個負值 ; 字符串 1等于字符串 2,strcmp函數(shù)返回零 ; 字符串 1大于字符串 2,strcmp函數(shù)返回一個正值 ;那么 ,字符中的大小是如何比較的呢 ?來看一個例子。     實際上 ,字符串的比較是比較字符串中各對字符的 ASCII碼。首先比較兩個串的第一個字符,若不相等,則停止比較并得出大于或小于的結(jié)果;如果相等就接著比較第二個字符然后第三個字符等等。如果兩上字符串前面的字符一直相等 ,像 "

23、disk"和 "disks"  那樣 ,  前四個字符都一樣 ,  然后比較第五個字符 ,  前一個字符串 "disk"只剩下結(jié)束符 '0',后一個字符串 "disks"剩下 's','0'的 ASCII碼小于 's'的 ASCII碼 ,所以得出了結(jié)果。因此無論兩個字符串是什么樣, strcmp函數(shù)最多比較到其中一個字符串遇到結(jié)束符 '0'為止,就能得出結(jié)果。 注意:字符串是數(shù)組類型而非簡單類型,不能用關(guān)系

24、運算進行大小比較。     if("ABC">"DEF" /*錯誤的字符串比較 */     if(strcmp("ABC","DEF" /*正確的字符串比較 */  strcpy 函數(shù)     strcpy函數(shù)用于實現(xiàn)兩個字符串的拷貝。一般形式是:         strcpy(字符中 1,字符串 2    

25、其中 ,字符串 1必須是字符串變量 ,而不能是字符串常量。 strcpy函數(shù)把字符串 2的內(nèi)容完全復制到字符串 1中 ,而不管字符串 1中原先存放的是什么。復制后,字符串 2保持不變。 例 :      注意 ,由于字符串是數(shù)組類型 ,所以兩個字符串復制不通過賦值運算進行。     t=s; /*錯誤的字符串復制 */     strcpy(t,s; /*正確的字符串復制 */  綜合舉例  例 :   輸入一行字符 ,統(tǒng)計其中有多少個單詞,單詞之間用空格

26、分隔開。     分析:程序中設(shè)置變量i作為循環(huán)變量,num用來統(tǒng)計單詞個數(shù),word作為判別是否單詞的標志,若word=0表示未出現(xiàn)單詞,如出現(xiàn)單詞word置1。    單詞的數(shù)目可以由空格出現(xiàn)的次數(shù)決定(連續(xù)的若干個空格作為出現(xiàn)一次空格;一行開頭的空格不在內(nèi))。 #include "stdio.h" main( char string81; int i,num=0,word=0; char c; gets(string; for(i=0,(c=stringi!='0',i+ if(c='' word=0; else i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論