今天在看同事的代碼時趕上下面一行代碼:html
<!-- lang: cpp --> fscanf(pfile, "WEBSPORT=\"%[^\"]\n", webport);
代碼的做用很簡單,只是函數中的格式控制符我忽然有點感受陌生了,從學校出來後,就比較少用到scanf函數,所以對它的格式控制符也就漸漸地陌生。既然陌生,就必需要從新熟悉才行,因而上網查找了一下,完全地弄明白上面的含義,從新熟悉了一下scanf函數的格式控制符。在此備忘我的以爲比較容易忘記的一些格式控制符。web
<!-- lang: cpp --> "% * 域寬 l/h d/o/x/c/s/f/e" //無%u格式、%g格式
說明:函數
%後的「*」 附加說明符,用來表示跳過它相應的數據指針
根據格式字符的含義從輸入流中取得數據,當輸入流中數據類型與格式字符要求不符時,就認爲這一項結束code
隱示分隔符:空格、製表符('\t')、換行符('\n')都是C語言認定的數據分隔符htm
顯示分隔符。在scanf函數的兩個格式說明項間有一個或多個普通字符,那麼在輸入數據時,在兩個數據之間也必須以這一個或多個字符分隔。如語句:blog
<!-- lang: cpp --> scanf("a=%d,b=%f,c=%f", &a, &b, &c); //輸入數據應該爲:a=1234,b=67.8,c=98.123
使用 %s 格式符是能夠的,可是%s遇到空白字符(空格、製表符、\r、\n)就結束字符串
使用 %[...] 格式模式進行字符串輸入的匹配控制,經過示例進行說明:get
<!-- lang: cpp --> const char *p="12232114687adeABC12356"; scanf("%[123]%[46-8]%[a-zA-Z]%[1-6]", buf1,buf2,buf3,buf4); //上面語句的結果將爲:buf1="1223211",buf2="4687" //buf3="adeABC",buf4="12356"
%[pattern]表示從輸入源讀取字符到變量中,直到讀取到的某個字符不屬於pattern模式中的字符中止,pattern中的字符不區分前後順序,以單個字符做爲基本單元;pattern支持範圍表示,如只讀取數字,可使用%[0-9],只讀取字母,使用%[a-zA-Z];若是pattern中的第一個字母是"^",則表示對^符號以後的pattern取反,如%[^A-Za-z]的意思就是取字母以外的全部字符。變量
使用 %[^\n]%*c 讀取一行字符,不能使用%s進行讀取,表示讀到\n爲止,%*c的做用就是把\n去掉,不然再次讀的時候一直遇到的都是\n。
全部對%s起做用的控制,均可以用於%[],好比"%*[^\n]%*c"就表示跳過一行,"%-20[^\n]"就表示讀取\n前20個字符。
如今再來看文章開頭的那行代碼就清楚了:"%[^"]\n,"將雙引號進行轉義爲普通字符,%[^"]表示讀取到下一個雙引號結束,\n表示在輸入源中有一個換行符。實際的文件輸入源內容爲:
<!-- lang: cpp --> WEBSPORT="80"
文章參考:http://www.cnblogs.com/huzhongzhong/archive/2011/07/15/2107216.html
補充: