天天看點

Chapter 11 字元串和字元串函數(Character Strings and String Functions)要點總結

目錄

  • 要點總結
    • 1. 表示字元串和字元串I/O
    • 2. 字元串輸入
    • 3. 字元串輸出
    • 4. 字元串函數

要點總結

1. 表示字元串和字元串I/O

  • puts()和printf()函數都屬于stdio.h系列的輸入輸出函數。但是,與Printf()不同的是,puts()函數隻顯示字元串,而且自動在顯示的字元串末尾加上換行符。
  • 字元串常量,指用雙引号括起來的的内容。
  • 字元串常量屬于靜态存儲類别,即隻被存儲一次,但可以存在于整個程式的生命期。
  • 用雙引号括起來的内容被視為指向該字元串存儲位置的指針。
  • 數組和指針
    • 二者都可以表示字元串的位址,但是這兩種形式并不完全相同。
    • 差別:
      • 初始化數組把靜态存儲區的字元串拷貝到數組中,而初始化指針隻把字元串的位址拷貝給指針。
      • 數組名是常量,而指針名是變量。是以隻有指針可以進行遞增操作。
      • 具體解釋
        • 數組形式(ar[])在計算機的記憶體中配置設定一個内含29個元素的數組(每個元素對應一個字元,還加上一個末尾的空字元\0),每個元素被初始化為字元串字面量對應的字元。通常,字元串都作為可執行檔案的一部分儲存在資料段中。當 把程式載入記憶體時,也載入了程式中的字元串。字元串儲存在靜态存儲區中。但是,程式在開始運作時才會為該數組配置設定記憶體。此時,才将字元串拷貝到數組中。 注意,此時字元串有兩個副本。一個是靜态記憶體中的字元串字面量,另一個是儲存在ar1數組中的字元串。此後,編譯器把數組名ar1識别為該數組首元素位址的别稱。在數組形式中,ar1是位址常量。不能更改ar1,如果改變了ar1,則意味着改變了數組的存儲位置。可以進行ar1+1這樣的操作,不能進行++ar1這樣的操作。遞增運算符隻能用于變量名前,不能用于常量。
        • 指針形式(*pt1)也使得編譯器為字元串在靜态存儲區預留29個元素的空間。一旦開始執行程式,它會為指針變量留出一個儲存位置,并把字元串的位址儲存在指針變量中。該變量最初指向該字元串的首字元,但是它的值是可以改變的。是以,可以使用遞增運算符。
    • 建議 在把指針初始化字元串字面量時使用const限定符。如果不修改字元串,不要用指針指向字元串字面量。編譯器可以使用記憶體中的一個副本來表示所有完全相同的字元串字面量。如果使用單次副本表示法,并允許修改其中的某一個字元,那将影響所有使用該字元串的代碼。
    • 通過指派方式copy字元串,實際上隻是拷貝了這個字元串的位址,即讓拷貝後的變量也指向原字元串。如果真的需要拷貝整個數組,可以使用strcpy()和strncpy()函數。

2. 字元串輸入

  • 把字元串讀入程式,首先預留出存儲該字元串的空間,然後用輸入函數擷取該字元串。
    • 配置設定空間。最簡單的方法是在聲明時顯式指明數組的大小;另一種是通過C庫函數來配置設定記憶體。
  • 在讀取字元串時,scan()和轉換說明%s隻能讀取一個單詞。
  • 讀取整行輸入,可以使用gets()。gets()函數簡單易用,并在這些字元的末尾添加一個空字元使其成為一個C字元串。但是,gets()函數不能檢查出字元串長度是否溢出。因為此函數隻知道數組的開始,并不知道數組中有多少個元素。
  • fgets()函數通過第2個參數限制讀入的字元的最大數量來解決溢出問題。如果該參數的值時n,那麼fgets()将讀入n-1個字元,或者讀到遇到的第一個換行符為止。第3個參數指明要讀入的檔案。如果讀入從鍵盤輸入的資料,則以stdin作為參數,該辨別符定義在stdio.h中。例如,fgets(word, stlen, stdin)
  • fputs()函數第2個參數指明它要寫入的檔案,如果要顯示在計算機顯示器上,應使用stdout作為參數。例如,fputs(word, stdout)。
  • gets_s()函數與fgets()類似,用一個參數限制讀入的字元數。與fgets()的差別:gets_s()隻從标準輸入中讀取資料,是以不需要第三個參數。如果gets_s()讀到換行符,會丢棄它而不是儲存它。隻要輸入行未超過最大字元數,gets()和gets_s()幾乎一樣。如果讀到最大字元數還沒有讀到換行符,會執行一下幾步。首先把目标數組中的首字元設定為空字元,讀取并丢棄随後的輸入直到讀到換行符或者檔案結尾,然後傳回空指針。接着,調用依賴實作的處理函數,可能會中止或退出程式。

3. 字元串輸出

  • puts()函數隻需把字元串的位址作為參數傳遞給它。

4. 字元串函數

  • strlen()函數用于統計字元串的長度。
  • strcat()函數用于拼接字元串。接受兩個字元串作為參數。該函數把第二個字元串附加在第一個字元串末尾,并把拼接後形成的新字元串作為第一個字元串,第二個字元串不變。但是無法檢查第一個數組是否能容納第二個字元串。
  • strncat()函數第三個參數指定了最大添加字元數。
  • strcmp()函數用于比較字元串。相同傳回0,不同傳回非0.
  • strncmp()函數比較字元串中的字元,直到發現不同的字元位置。

繼續閱讀