C語言中的格式控制

2022-08-19 23:36:13 字數 2811 閱讀 5065

c語言確實很強大,很自由,特別是輸入輸出時的格式控制,熟練這些格式控制問題,可以很方便的解決很多奇怪的問題。當然,scanf和printf兩個函式也因它們的自由度和安全性而備受批評,特別是在大型程式設計中,一般是盡可能避免用這兩個函式的。但是對於習慣用c和參加acm/icpc的人來說,這兩個函式的重要性無可替代。

(sscanf和sprintf這兩個函式和scanf,printf類似,但是sscanf和sprintf更危險,略去不提)

scanf和printf函式格式:

scanf(格式控制串,變數位址表)

printf(格式控制串,變數表)

scanf的格式控制一般格式:

%  [*]  [域寬]  型別字元

printf的格式控制一般格式:

%  [-]  [0]  [域寬]  型別字元

先說兩者的共同點。

型別字元

%d,十進位制整型int;%ld,十進位制整型long;%lld,十進位制整型long long;%i64d,十進位制整型_int64

%o,八進位制整型

%x,十六進製制整型

%u,無符號十進位制整型

%f,實型float;%lf,實型double,小數字數預設都是6位

%c,乙個字元

%s,字串

當然,還有hd等的這些short中使用的型別字元就略去了,畢竟還有誰會用short型別呢?

各自特點:

先說scanf

scanf(格式控制串,變數位址表)

注意這裡是變數位址表,不是變數表,即輸入時一般要加字元&,不加的話就直接對位址操作,這是非常危險的。

格式控制:                  %  [*]  [域寬]  型別字元

1.符號*表示跳過該輸入值。這個在某些情況下非常好用,比如說輸入時要跳過乙個空格,則可以這樣寫:%*c,跳過乙個字元。

2.域寬只能是整數,表示擷取的相應寬度的輸入值賦給後邊相應的變數。

如:scanf("%3d",&x)

若輸入12345,則x的值為123;若輸入12,則x就是12

3.這裡要介紹乙個非常少見的格式控制方法[…]或[^...],官方名字叫掃瞄集(scanset)。

例1:scanf("%[0123456789]",strings)        //strings是乙個字串陣列

則輸入值必須在0-9中,如果輸入123a456,則strings儲存的只是123,到a處截止。當然,掃瞄集中的元素可以用連線字元「-」來表示,如0123456789可以寫成0-9,也可以寫成9-0。

例2:scanf("%[^012]",strings)

則輸入的值要除去012,比如輸入abc321s,則strings儲存的是abc3,到2處截止。

別小看這個掃瞄集!有時候要輸入一行字串時,一般要用gets()函式,但是當這個函式和scanf連用時,會發生很多很奇怪的錯誤,而用掃瞄集就非常方便。

例3:scanf("%[^\n]",strings)

這樣就可以直接讀入一行字串且游標換到了下一行。當然,掃瞄集中例也可以定義空格,其他符號等等。

注意:掃瞄集是乙個集合,而集合是無順序的,也就是說[012]也可以寫成[021]  [120]  [0-2]  [2-0]

掃瞄集是區分大小的,也就是說[a-z]和[a-z]是完全不同的。

printf

%  [-]  [0]  [域寬]  型別字元

1.符號「-」表示輸出左對齊,這裡主要針對域寬起作用,如果沒有定義域寬,則這個符號基本上沒用。

2.符號0,表示空位用0填充。

3.域寬。

預設為右對齊,空位預設為空格。

域寬可以這樣寫:[m]  [m.n]  [.n],[m]表示輸出寬度為m。若輸出值寬度大於m,則如實輸出;[m.n]主要用於實型的輸出,表示輸出佔m個位置,其中有n個小數字,若輸出值的數字大於m,則如實輸出,而小數字則四捨五入到n位,不足的補0;[.n]就是[0.n]。

例:float x=12.39;

printf("%2.3f",x); // 輸出12.390,沒有多餘空格

printf("%7.3f",x);  //輸出_12.390,第一位是空格,注意這裡小數點也算一位

printf("%.1f",x);  //輸出12.3,沒有多餘空格

域寬還有一種比較奇怪的定義方法:

printf("%*.*f",m,n,x);  //表示域寬是m.n,輸出值是x

這樣就可以在程式執行過程中控制輸出域寬。

4.字串輸出

字串的輸出主要是域寬的控制問題。

寫法和上面的一樣,但是定義略有不同。[m.n]表示輸出佔m個位置,擷取字串的前n個字元輸出,預設右對齊,空位預設為空格。

5.實型的輸出

實型輸出有三種型別字元,乙個是f和lf,乙個是e和e,乙個是g和g。

l和lf上面已經說過,e表示輸出的實型按照科學計數法輸出,g表示自動選取f格式和e格式中較短的乙個輸出,不輸出無意義的0。

例:float x=12.34;

printf("%f",x);     //輸出12.340000

printf("%e",x);    //輸出1.234000e+001

printf("%e",x);   //輸出1.234000e+001,就是把小寫e變成大寫e,下面的g和g類似情況

printf("%g",x);    //輸出12.34

對於float,使用%f格式符輸出時,僅前7位是有效數字,小數6位.

對於double,使用%lf格式符輸出時,前16位是有效數字,小數6位.

c語言的常用的格式控制就這些。一般來說,推薦使用c++中的cin和cout,安全,直接。但是c的效率是c++望塵莫及的,敲程式時注意兩者的結合使用。

C語言中的格式控制符

用在輸入 輸出函式scanf 和printf 中的格式控制部分,即第乙個逗號前的雙引號內 用來對輸出的資料 識別符號或表示式 進行格式說明,包括資料型別 長度 對齊方式 小數字數等。1.格式控制符的形式 0 m m.n l h 格式控制符 其中 裡面的內容是可選的 表示左對齊,預設情況下為右對齊 若...

c語言中輸入輸出格式的控制

一 輸入格式的控制 scanf函式中格式字元 1 d,i 用來輸入有符號的十進位制中 2 u 用來輸入無符號的十進位制整數 3 o 用來輸入無符號的八進位制整數 4 x,x 用來輸入無符號的十六進製制整數 大小寫作用相同 5 c 用來輸入單個符號 6 s 用來輸入字串,將字串送到乙個字元陣列中,在輸...

c語言中的格式符

在turbo c中格式字串的一般形式為 標誌 輸出最小寬度 精度 長度 型別 其中方括號中的項為可選項。各項的意義介紹如下 1.型別型別字元用以表示輸出資料的型別,其格式符和意義下表所示 表示輸出型別的格式字元 格式字元意義 d 以十進位制形式輸出帶符號整數 正數不輸出符號 o 以八進位制形式輸出無...