C語言printf()函式:格式化輸出函式
標頭檔案:#include <stdio.h>
printf()函式是最常用的格式化輸出函式,其原型為:
int printf( char * format, ... );
printf()會根據引數 format 字串來轉換並格式化資料,然後將結果輸出到標準輸出裝置(顯示器),直到出現字串結束('\0')為止。
引數 format 字串可包含下列三種字元型別:
- 一般文字,將會直接輸出
- ASCII 控制字元,如\t、\n 等有特定含義
- 格式轉換字元
格式轉換為一個百分比符號(%)及其後的格式字元所組成。一般而言,每個%符號在其後都必需有一個引數與之相呼應(只有當%%轉換字元出現時會直接輸出%字元),而欲輸出的資料型別必須與其相對應的轉換字元型別相同。
printf()格式轉換的一般形式如下:
%(flags)(width)(. prec)type
以括號括起來的引數為選擇性引數,而%與type 則是必要的,下面介紹 type 的幾種形式。
1) 整數
- %d 整數的引數會被轉成有符號的十進位制數字
- %u 整數的引數會被轉成無符號的十進位制數字
- %o 整數的引數會被轉成無符號的八進位制數字
- %x 整數的引數會被轉成無符號的十六進位制數字,並以小寫abcdef 表示
- %X 整數的引數會被轉成無符號的十六進位制數字,並以大寫ABCDEF 表示浮點型數
- %f double 型的引數會被轉成十進位制數字,並取到小數點以下六位,四捨五入
- %e double 型的引數以指數形式列印,有一個數字會在小數點前,六位數字在小數點後,而在指數部分會以小寫的e 來表示
- %E 與%e 作用相同,唯一區別是指數部分將以大寫的E 來表示
- %g double 型的引數會自動選擇以%f 或%e 的格式來列印,其標準是根據列印的數值及所設定的有效位數來決定。
- %G 與%g 作用相同,唯一區別在以指數形態列印時會選擇%E 格式。
2) 字元及字串
- %c 整型數的引數會被轉成unsigned char 型列印出
- %s 指向字串的引數會被逐字輸出,直到出現NULL 字元為止
- %p 如果是引數是"void *"型指標則使用十六進位制格式顯示
prec 有幾種情況:
- 正整數的最小位數
- 在浮點型數中代表小數位數
- 格式代表有效位數的最大值
- 在%s 格式代表字串的最大長度
- 若為×符號則代表下個引數值為最大長度
width 為引數的最小長度,若此欄並非數值,而是*符號,則表示以下一個引數當做引數長度。
flags 有下列幾種情況
- + 一般在列印負數時,printf ()會加印一個負號,整數則不加任何負號,此旗標會使得在列印正數前多一個正號 (+)。
- # 此旗標會根據其後轉換字元的不同而有不同含義。當在型別為o 之前 (如%#o),則會在列印八進位制數值前多印一個o。而在型別為x 之前 (%#x)則會在列印十六進位制數前多印'0x',在型態為e、E、f、g 或G 之前則會強迫數值列印小數點。在型別為g 或G 之前時則同時保留小數點及小數位數末尾的零。
- 0 當有指定引數時,無數字的引數將補上0。預設是關閉此旗標,所以一般會列印出空白字元。
【返回值】成功則返回寫入的字元數目。
如果發生寫入錯誤,將會設定檔案錯誤標誌(可通過 ferror() 檢測),並返回一個負數。
如果在寫入寬字元時一個多位元組的字元發生編碼錯誤,那麼 errno 將被設定為 EILSEQ,並返回一個負數。
printf( format, ... ) 等價於 fprintf(stdout, format, ...),更多資訊請參考 fprintf() 函式。
【例項】分別輸出整數、浮點數和字串。
- #include<stdio.h>
- int main(void)
- {
- int a=1;
- float b=5.0;
- char str[100]= "";
- scanf("%c %c %c",&a,&b,str);
- /*分別演示 整數*/
- printf("int is:%d\n",a);
- /*分別演示 浮點數*/
- printf("float is:%f\n",b);
- /*分別演示 字串*/
- printf("char is:%s\n",str);
- return 0;
- }
【執行結果】
1 4.4 fs
int is:1
float is:4.400000
char is:fs
例子首先是等待使用者輸入整數浮點數和一個字串,然後呼叫函式printf()按照對應的格式輸出。
又如,輸出更多格式的資料。
- #include <stdio.h>
- int main()
- {
- printf ("Characters: %c %c \n", 'a', 65);
- printf ("Decimals: %d %ld\n", 1977, 650000L);
- printf ("Preceding with blanks: %10d \n", 1977);
- printf ("Preceding with zeros: %010d \n", 1977);
- printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
- printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
- printf ("Width trick: %*d \n", 5, 10);
- printf ("%s \n", "A string");
- return 0;
- }
Characters: a A
Decimals: 1977 650000
Preceding with blanks: 1977
Preceding with zeros: 0000001977
Some different radices: 100 64 144 0x64 0144
floats: 3.14 +3e+000 3.141600E+000
Width trick: 10
A string