程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言中scanf/fscanf 的%[]和%n說明符的使用方法

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

編輯:關於C

標准輸入輸出函數%[]和%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。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved