printf

格式化輸出函數

printf 是指格式化輸出函數,主要功能是向標準輸出設備按規定格式輸出信息。printf 是C語言標準庫函數,定義於頭文件 。printf 函數的一般調用格式為:printf("<格式化字元串>", <參量表>)。輸出的字元串除了可以是字母、數字、空格和一些數字元號以外,還可以使用一些轉義字元表示特殊的含義。

函數語法


函數聲明

printf 函數的聲明如下:
// C99 前int printf( const char *format, ... );// C99 起int printf( const char *restrict format, ... );

參數列表

● format -- 是格式控制字元串,包含了兩種類型的對象:普通字元和轉換說明。在輸出時,普通字元將原樣不動地複製到標準輸出,轉換說明並不直接輸出而是用於控制 printf 中參數的轉換和列印。每個轉換說明都由一個百分號字元(%)開始,以轉換說明結束,從而說明輸出數據的類型、寬度、精度等。
printf 的格式控制字元串 format 中的轉換說明組成如下,其中 [] 中的部分是可選的:
%[flags][width][.precision][length]specifier,即:%[標誌][最小寬度][.精度][類型長度]說明符。轉換說明詳解見下文。
● 附加參數 -- 根據不同的 format 字元串,函數可能需要一系列的附加參數,每個參數包含了一個要被插入的值,替換了 format 參數中指定的每個 % 標籤。參數的個數應與 % 標籤的個數相同。
printf
printf

功能

printf 函數在輸出格式 format 的控制下,將其參數進行格式化,並在標準輸出設備(顯示器、控制台等)上列印出來。

返回值

如果函數執行成功,則返回所列印的字元總數,如果函數執行失敗,則返回一個負數。

說明與應用


轉換說明詳解

format 轉換說明組成是%[flags][width][.precision][length]specifier,具體講解如下:
● 說明符(specifier)
說明符(specifier)用於規定輸出數據的類型,含義如下:
說明符(specifier)對應數據類型描述
d / iint輸出類型為有符號的十進位整數,i 是老式寫法
ounsigned int輸出類型為無符號八進位整數(沒有前導 0)
uunsigned int輸出類型為無符號十進位整數
x / Xunsigned int輸出類型為無符號十六進位整數,x 對應的是 abcdef,X 對應的是 ABCDEF(沒有前導 0x 或者 0X)
f / lfdouble輸出類型為十進位表示的浮點數,默認精度為6(lf 在 C99 開始加入標準,意思和 f 相同)
e / Edouble輸出類型為科學計數法表示的數,此處 "e" 的大小寫代表在輸出時用的“e”的大小寫,默認浮點數精度為6
gdouble根據數值不同自動選擇 %f 或 %e,%e 格式在指數小於-4或指數大於等於精度時用使用
Gdouble根據數值不同自動選擇 %f 或 %E,%E 格式在指數小於-4或指數大於等於精度時用使用
cchar輸出類型為字元型。可以把輸入的數字按照ASCII碼相應轉換為對應的字元
schar *輸出類型為字元串。輸出字元串中的字元直至遇到字元串中的空字元(字元串以 '\0‘ 結尾,這個 '\0' 即空字元)或者已列印了由精度指定的字元數
pvoid *以16進位形式輸出指針
%不轉換參數不進行轉換,輸出字元‘%’(百分號)本身
nint *到此字元之前為止,一共輸出的字元個數,不輸出文本
示例代碼:
// 以下程序用於輸出各種格式化數據(其中 "\n" 表示換行的轉義字元,具體見下文的轉義字元說明):#include int main() { char ch = 'h', int count = -9234; double fp = 251.7366; // 顯示整數 printf( "Integer formats:\n" " Decimal: %d Unsigned: %u\n", count, count); printf( "Decimal %d as:\n Hex: %Xh " "C hex: 0x%x Octal: %o\n", count, count, count, count ); // 顯示字元 printf("Characters in field:\n" "%10c\n", ch); // 顯示實數 printf("Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp ); return 0;} //程序運行結果:Integer formats: Decimal: -9234 Unsigned: 4294958062Decimal -9234 as: Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756Characters in field: hReal numbers: 251.736600 251.74 2.517366e+002 2.517366E+002
● flags(標誌)
標誌(flags)用於規定輸出樣式,含義如下:
flags(標誌)字元名稱描述
-減號在給定的欄位寬度內左對齊,右邊填充空格(默認右對齊)
+加號
強制在結果之前顯示加號或減號(+ 或 -),即正數前面會顯示 + 號;
默認情況下,只有負數前面會顯示一個 - 號
(空格)空格輸出值為正時加上空格,為負時加上負號
#井號
specifier 是 o、x、X 時,增加前綴 0、0x、0X;
specifier 是 e、E、f、g、G 時,一定使用小數點;
specifier 是 g、G 時,尾部的 0 保留
數字零對於所有的數字格式,使用前導零填充欄位寬度(如果出現了減號標誌或者指定了精度,則忽略該標誌)
示例代碼:
#include #define PAGES 931int main() { const double RENT = 3852.99; // const-style constant printf("*%-10d*\n", PAGES); //左對齊,右邊補空格 printf("*%+4.2f*\n", RENT); //輸出正負號 printf("%x %X %#x\n", 31, 31, 31); //輸出0x printf("**%d**% d**% d**\n", 42, 42, -42); //正號用空格替代,負號輸出 printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); //前面補0 return 0;} //程序運行結果:*931 **+3852.99*1f 1F 0x1f**42** 42**-42**** 6** 006**00006** 006**
● width(最小寬度)
最小寬度(width)用於控制顯示欄位的寬度,取值和含義如下:
width(最小寬度)字元名稱描述
digit(n)數字欄位寬度的最小值,如果輸出的欄位長度小於該數,結果會用前導空格填充;如果輸出的欄位長度大於該數,結果使用更寬的欄位,不會截斷輸出
*星號寬度在 format 字元串中規定位置未指定,使用星號標識附加參數,指示下一個參數是width
示例代碼:
#include #define PAGES 931int main() { printf("*%2d*\n", PAGES); //輸出的欄位長度大於最小寬度,不會截斷輸出 printf("*%10d*\n", PAGES); //默認右對齊,左邊補空格 printf("*%*d*\n", 2, PAGES); //等價於 printf("*%2d*\n",PAGES) return 0;} //程序運行結果:*931** 931**931*
● .precision(精度)
精度(.precision)用於指定輸出精度,取值和含義如下:
.precision(精度)字元名稱描述
.digit(n)點+數字
對於整數說明符(d、i、o、u、x、X):precision 指定了要列印的數字的最小位數。如果寫入的值短於該數,結果會用前導零來填充。如果寫入的值長於該數,結果不會被截斷。精度為 0 意味著不寫入任何字元;
對於 e、E 和 f 說明符:要在小數點后輸出的小數位數;
對於 g 和 G 說明符:要輸出的最大有效位數;
對於 s 說明符:要輸出的最大字元數。默認情況下,所有字元都會被輸出,直到遇到末尾的空字元;
對於 c 說明符:沒有任何影響;
當未指定任何精度時,默認為 1。如果指定時只使用點而不帶有一個顯式值,則標識其後跟隨一個 0。
.*點+星號精度在 format 字元串中規定位置未指定,使用點+星號標識附加參數,指示下一個參數是精度
示例代碼:
#include int main() { const double RENT = 3852.99; // const-style constant printf("*%4.2f*\n", RENT); printf("*%3.1f*\n", RENT); printf("*%10.3f*\n", RENT); return 0;} //程序運行結果:*3852.99**3853.0** 3852.990*
● length(類型長度)
類型長度(length)用於控制待輸出數據的數據類型長度,取值和含義如下:
length(類型長度)描述
h參數被解釋為短整型或無符號短整型(僅適用於整數說明符:i、d、o、u、x 和 X)
l參數被解釋為長整型或無符號長整型,適用於整數說明符(i、d、o、u、x 和 X)及說明符 c(表示一個寬字元)和 s(表示寬字元字元串)
示例代碼:
#include #define PAGES 336int main() { short num = PAGES; long n3 = 2000000000; long n4 = 1234567890; printf("num as short and unsigned short: %hd %hu\n", num, num); printf("%ld %ld\n", n3, n4); return 0;} //程序運行結果:num as short and unsigned short: 336 336 2000000000 1234567890

轉義序列

轉義序列在字元串中會被自動轉換為相應的特殊字元。printf() 使用的常見轉義字元如下:
轉義序列描述ASCII 編碼
\'單引號0x27
\"雙引號0x22
\?問號0x3f
\\反斜杠0x5c
\a鈴聲(提醒)0x07
\b退格0x08
\f換頁0x0c
\n換行0x0a
\r回車0x0d
\t水平製表符0x09
\v垂直製表符0x0b
示例代碼:
#include int main(void) { printf("This\nis\na\ntest\n\nShe said, \"How are you?\"\n"); return 0;}//程序運行結果:ThisisatestShe said, "How are you?"

注意事項


函數返回值

printf 函數的返回值為其輸出字元串常量的字元數(注意字元數與字數的區別),注意計數針對所有的列印字元,包括空格和不可見的換行字元(不包括字元串的空字元)。

列印較長字元串

有時printf 語句會很長,以至於不能在一行被放下,如果我們必須分割一個字元串,有以下三種方式可以選擇。需要注意的是,我們可以在字元串中使用 "\n" 換行符來表示換行字元,但是在字元串中不能通過回車鍵來產生實際的換行字元。
示例代碼:
#include int main() { //方式一:使用多個printf語句 printf("Here's one way to print a "); printf("long string.\n"); //方式二:使用反斜杠 "\" 加回車的組合來進行分割,注意下一行要從最左側開始,否則縮進會成為該字元串的一部分 printf("Here's another way to print a \long string.\n"); //方式三:採用字元串連接的方法,中間不能有逗號,可以是空格或者回車 printf("Here's the newest way to print a " "long string.\n"); return 0;}//程序運行結果:Here's one way to print a long string.Here's another way to print a long string.Here's the newest way to print a long string.