scanf 格式化字串詳解

2022-05-22 00:54:10 字數 3004 閱讀 2072

scanf格式控制的完整格式:

%     *     m     l或h     格式字元

①格式字元與printf函式中的使用方式相同,以%d、%o、%x、%c、%s、%f、%e,無%u格式、%g格式。

②可以指定輸入資料所佔列寬,系統自動按它擷取所需資料。如:

scanf( "%3d%3d", &a, &b);

輸入:123456

系統自動將123賦給a,456賦給b。

③%後的「*」 附加說明符,用來表示跳過它相應的資料。例如:

scanf( "%2d%*3d%2d", &a, &b);

如果輸入如下資訊:1234567。將「12 」賦給a,「67 」賦給b。第二個資料「345」被跳過不賦給任何變數。

④輸入資料時不能規定精度,例如:

scanf( "%7.2f", &a);

是不合法的,不能企圖輸入:12345.67而使a的值為12345.67。

附加格式說明字元:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

字元                                   說明

——————————————————————————————————————

l           用於輸入長整型資料(可用%ld,%lo,%lx)以及double型資料(用%lf或%le)

——————————————————————————————————————

h           用於輸入短整型資料(可用%hd, %ho, %hx)

——————————————————————————————————————

域寬         指定輸入資料所佔寬度(列數),域寬應為正整數

——————————————————————————————————————

*           表示本輸入項在讀入後不賦紿相應的變數

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

------------------相關-------------------

輸入資料流分隔

①根據格式字元的含義從輸入流中取得資料,當輸入流中資料型別與格式字元要求不符時,就認為這一項結束。例如:

scanf( "%d%c%f", &a, &b, &c);

如果輸入如下資訊:

1234r1234.567

則scanf函式在接收資料時發現「r」型別不匹配,於是把「1234」轉換成整型賦值給a,把「r」賦給變數b,最後把「1234.567」轉換成實型資料賦給c。

②根據格式項中指定的域寬分隔出資料項。如語句:

scanf( "%2d%3f%4f", &a, &b, &c);

如果輸入如下資訊:

123456789012345

則scanf函式在接收資料時根據域寬把12賦值給a,345賦值給b,6789賦值給c。

③隱示分隔符。空格、跳格符('\t')、換行符('\n')都是c語言認定的資料分隔符。

④顯示分隔符。在scanf函式的兩個格式說明項間有乙個或多個普通字元,那麼在輸入資料時,在兩個資料之間也必須以這乙個或多個字元分隔。如語句:

scanf( "a=%d,b=%f,c=%f", &a, &b, &c);

則輸入資料應該為:

a=1234,b=67.8,c=98.123

---------------------------------------

關於scanf函式的進一步說明:

①scanf函式中的「格式控制」後面應當是變數位址,而不應是變數名。例如,如果a、b為整型變數,則

scanf( "%d,%d", a, b);

是不對的,應將「a, b」改為 「&a, &b」。

②如果在「格式控制」字串中除了格式說明以外還有其它字元,則在輸入資料時應輸入與這些字元相同的字元。例如:

scanf( "%d,%d", &a, &b);

輸入時應輸入:3,4。3與4之間的逗號應與scanf函式中的「格式控制」中的逗號相對應,輸入其它符號是不對的。

③在用「%c」格式輸入字元時,空格字元和轉義字元都作為有效字元輸入。

scanf( "%c%c%c", &c1, &c2, &c3);

如輸入:a b c 。字元 'a' 賦給c1,字元(空格)'     ' 賦給c2,字元 'b'     賦給c3。

④ scanf        中不使用u說明符.對unsigned型資料用d、o、x說明符輸入.

補充:對於 const char* p = "12232114687abc12356";

scanf( "%[123]", buf); // 就把是'1'或'2'或'3'的字讀讀到buf中,直到遇到乙個不是'1'且不是'2'且不是'3'的字元,於是執行後buf應該是"1223211";

%[123]等同於%[231],等同於%[321]……,列表中的順序是無所謂的;

%[123]也等同於%[1-3]或%[3-1],也就是「1至3」,對於連續的字元列表這樣寫就很簡單,比如%[a-z]等同%[abc…省略…z];

想想看,%[3-14]應該等同於什麼?是「3至14」嗎?當然不是,因為中的是字元,而不是數字,所以%[3-14]應該等同於%[3214],等同於%[1234];

同理,想只取字母,那就可以寫成%[a-za-z];

如果列表的第乙個字母是^,那麼正好相反,比如%[^a-za-z]的意思就是取字母之外的所有字元。

對於字串"abdec123"如果想按照字母和數字讀到兩個字串中就應該是 "%[a-za-z]%[0-9]",buf1,buf2 ;

假如我想取一行字元,該怎麼辦?"%s"是不行的,因為%s遇到空白字元(空格、製表符、\r、\n)就結束了,所以可以寫成

"%[^\n]%*c",%[^\n]的作用剛才講過了,就是讀\n之外的所有字元,也就是說讀到\n為止,%*c的作用就是把\n去掉,否則再次讀的時

候一直遇到的都是\n;

所有對%s起作用的控制,都可以用於%,比如"%*[^\n]%*c"就表示跳過一行,"%-20[^\n]"就表示讀取\n前20個字元。

scanf 格式化字串詳解

scanf格式控制的完整格式 m l或h 格式字元 格式字元與printf函式中的使用方式相同,以 d o x c s f e,無 u格式 g格式。可以指定輸入資料所佔列寬,系統自動按它擷取所需資料。如 scanf 3d 3d a,b 輸入 123456 系統自動將123賦給a,456賦給b。後的 ...

字串格式化

sprintf snprintf snprintf std stringstream std strstream boost lexical cast boost format cstring format 1 sprintf 使用 sprintf 不安全,輕則破壞資料的準確性,重則程式崩潰。請看下...

格式化字串

通常在使用字串的時候,會對字串進行格式化,然後輸出或呼叫 一般我們使用替換標記對字串進行格式化 string str1 string.format add is 1,2,3 而且在c 中的替換標記可以以任意順序和次數出現在格式化字串中,但替換值是按順序排的,而且替換標記不能超出索引範圍 string...