scanf fscanf 自定義讀取規則

2021-10-14 06:36:17 字數 1655 閱讀 7002

**

個人覺得非常有用但是較少人知道,所以**出來,也方便自己以後回顧。

標準輸入輸出函式%和%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]」,中間的]字元不會被看作掃瞄列表的成員,而且輸入輸出的結果會是亂七八糟的。

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。

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...