C語言中scanf/fscanf 的%[]和%n說明符的使用方法

標準輸入輸出函數%[]和%n說明符的使用方法
   scanf fscanf,均從第一個非空格的可顯示字符開始讀起!
        標準輸入輸出函數scanf具有相對較多的轉換說明符,它常常作爲入門級函數出現在各種教材中。但奇怪的是,[]和n這兩種都爲c89/c99所規定的標準說明符卻鮮少在大多數教材中出現。雖然[]和n說明符的使用頻率不及其它說明符,但兩者在程序設計中的作用仍然不可小視,尤其是[]說明符。

        衆所周之,scanf以空白字符爲定界符,但如果輸入的字符串是以其它字符爲定界符的,那怎麼辦?[]就是專門處理這個問題的轉換說明符。[]轉換說明符可以通過兩種方式產生結果字符集,如果第一個[字符右邊沒有抑揚符(^),那麼處於[]之間的字符就是結果字符集,不在其中的可輸入字符都作爲定界符;如果左邊[符號緊靠一個抑揚符(^),那麼意義相反,^和]之間的字符是定界符,其餘可輸入字符是結果字符集。

        在使用[]說明符之前,得先明白兩個概念:一是掃描列表。掃描列表(scanlist)指的是包含在[和]兩個字符之間除緊靠左邊[字符的抑揚符之外的字符,例如:

scanf("%[abcd]", ptr);

abcd組成掃描列表。二是掃描字符集(scanset)。掃描字符集指的是結果字符集,例如上面的例子,結果字符集就是abcd。如果輸入一個字符串“cbadkjf”,那麼ptr得到的字符串是cbad,kjf三個字符都屬於定界符,輸入到k字符時輸入字符串被截斷,kjf三個字符被留在stdin裏面。如果帶有抑揚符,例如:

scanf("%[^abcd]", ptr);

掃描列表仍然是abcd,但掃描字符集是除abcd外的可輸入字符。如果輸入字符串“jksferakjjdf”,ptr得到的字符串是“jksfer”。如果想限制輸入字符串的字符數量,可以象s說明符那樣,在[]前面使用位域,例如:

scanf("%10[^abcd]", ptr);

這樣結果字符串最多隻能包含10個字符(除'/0'字符外)。

        [符號可以作爲掃描列表中的一個成員,但]字符除緊貼最左邊的[字符或抑揚符兩種情況外,其餘情況下都不會被看作掃描列表的成員。例如“%[]abcd]”或者“%[^]abcd]”,上述兩種情況下]字符屬於掃描列表的成員,但如果是“%[ab]cd]”,中間的]字符不會被看作掃描列表的成員,而且輸入輸出的結果會是亂七八糟的。

        對於減號-,只有在緊貼[字符或抑揚字符以及作爲掃描列表最後一個成員時,-字符纔會被視爲掃描列表的成員。c標準把其餘情況規定爲編譯器相關的。大多數編譯器把這種情況的減號定義爲連字符,例如:

scanf("%[a-zA-Z]", ptr);

那麼掃描列表由大小寫各26個字母組成。少數編譯器仍舊把這種情況下的減號視爲掃描列表成員。
fscanf(fd,"%*[^/n]/n");//%*是虛讀,沒有存,只是讓指針跳過了這個變量!

        %n說明符輸出有效字符數量,%n在scanf和printf中都可使用。與%n相對應的形參是一個int類型的指針,%n不影響scanf和printf的返回值。例如:

scanf("%d %d%n", &i, &j, &k);

如果輸入434 6434,則k等於8,而scanf的返回值仍然爲2。又如:

scanf("%c%n", &ch, &k);

輸入“sbcdefdg”後,k等於1,而不是8,因爲%c只取一個字符,%n輸出的是有效字符數量。

        %n用在printf函數裏,表示輸出的字符數量,例如:

printf("i=%d, j=%d/n%n", i, j, &k);

在i=343、j=123的情況下,k=12,同時%n不影響printf的返回值,其返回值仍然爲12,而不是14。 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章