複製鏈接
請複製以下鏈接發送給好友

printf

(格式化輸出函數)

鎖定
printf 是指格式化輸出函數,主要功能是向標準輸出設備按規定格式輸出信息。printf 是C語言標準庫函數,定義於頭文件 。printf 函數的一般調用格式為:printf("<格式化字符串>", <參量表>) [1]  。輸出的字符串除了可以是字母、數字、空格和一些數字符號以外,還可以使用一些轉義字符表示特殊的含義 [2] 
中文名
格式化輸出函數 [1] 
外文名
printf [1] 
特    點
變參函數 [1] 
功    能
向標準輸出設備按規定格式輸出信息 [1] 
頭文件
stdio.h [1] 
返回值
打印字符串的長度 [3] 

printf函數語法

printf函數聲明

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

printf參數列表

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

printf功能

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

printf返回值

如果函數執行成功,則返回所打印的字符總數,如果函數執行失敗,則返回一個負數。 [3] 

printf函數説明及應用示例

printf轉換説明詳解

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

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

//程序運行結果:
This
is
a
test

She said, "How are you?"

printf注意事項

printf函數返回值

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

printf打印較長字符串

有時printf 語句會很長,以至於不能在一行被放下,如果必須分割一個字符串,有以下三種方式可以選擇。需要注意的是,可以在字符串中使用 "\n" 換行符來表示換行字符,但是在字符串中不能通過回車鍵來產生實際的換行字符。 [3] 
示例代碼: [3] 
#include <stdio.h>
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");      /* ANSI C */
     
    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.
在使用printf函數進行數據輸出、特別是進行多個輸出時,要注意一下問題: [8] 
1.前後格式要一致 [8] 
2.輸出個數要相等 [8] 
3.附加格式要清楚 [8] 
4.求值順序要理清 [8] 
參考資料