C語言中scanf函數用到的格式控制

今天在看同事的代碼時趕上下面一行代碼:html

<!-- lang: cpp -->
 fscanf(pfile, "WEBSPORT=\"%[^\"]\n", webport);

代碼的做用很簡單,只是函數中的格式控制符我忽然有點感受陌生了,從學校出來後,就比較少用到scanf函數,所以對它的格式控制符也就漸漸地陌生。既然陌生,就必需要從新熟悉才行,因而上網查找了一下,完全地弄明白上面的含義,從新熟悉了一下scanf函數的格式控制符。在此備忘我的以爲比較容易忘記的一些格式控制符。web

scanf中的完整格式控制字符串序列:

<!-- lang: cpp -->
"%  *  域寬  l/h  d/o/x/c/s/f/e"   //無%u格式、%g格式

說明:函數

  1. %後的「*」 附加說明符,用來表示跳過它相應的數據指針

  2. 根據格式字符的含義從輸入流中取得數據,當輸入流中數據類型與格式字符要求不符時,就認爲這一項結束code

  3. 隱示分隔符:空格、製表符('\t')、換行符('\n')都是C語言認定的數據分隔符htm

  4. 顯示分隔符。在scanf函數的兩個格式說明項間有一個或多個普通字符,那麼在輸入數據時,在兩個數據之間也必須以這一個或多個字符分隔。如語句:blog

    <!-- lang: cpp -->
    scanf("a=%d,b=%f,c=%f", &a, &b, &c); //輸入數據應該爲:a=1234,b=67.8,c=98.123

字符串的輸入

  1. 使用 %s 格式符是能夠的,可是%s遇到空白字符(空格、製表符、\r、\n)就結束字符串

  2. 使用 %[...] 格式模式進行字符串輸入的匹配控制,經過示例進行說明: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]的意思就是取字母以外的全部字符。變量

  1. 使用 %[^\n]%*c 讀取一行字符,不能使用%s進行讀取,表示讀到\n爲止,%*c的做用就是把\n去掉,不然再次讀的時候一直遇到的都是\n。

  2. 全部對%s起做用的控制,均可以用於%[],好比"%*[^\n]%*c"就表示跳過一行,"%-20[^\n]"就表示讀取\n前20個字符。

如今再來看文章開頭的那行代碼就清楚了:"%[^"]\n,"將雙引號進行轉義爲普通字符,%[^"]表示讀取到下一個雙引號結束,\n表示在輸入源中有一個換行符。實際的文件輸入源內容爲:

<!-- lang: cpp -->
WEBSPORT="80"

文章參考:http://www.cnblogs.com/huzhongzhong/archive/2011/07/15/2107216.html


補充:

  1. 今天看到%n格式控制符:%n讀取scanf和printf函數在該格式符以前實際已經讀取或輸出的字符數量,將該數量存儲在函數中對應位置的整形變量內(能夠無論它),能夠用來進行指針的移動和定位。%n格式控制符的使用不影響scanf和printf函數的返回值,以及後續格式符的使用。
  2. 關於scanf和printf函數的返回值:scanf函數返回的是實際成功匹配和賦值的變量個數,第一個都不匹配時返回0,若是在進行第一個變量轉換時到達輸入結束則返回EOF;而printf函數返回的是輸出的字符數量(不包含字符串結束符)。
相關文章
相關標籤/搜索