格式化輸出函數:printf 那些事 (C語言)



printf函數提供格式化輸出轉換

函數包含在頭文件  <stdio.h>  中

#include <stdio.h>
    ......

 函數的原型在頭文件的聲明為

_CRTIMP __cdecl __MINGW_NOTHROW  int printf (const char *, ...);

第一個參數  const char * 來指明輸出的格式 , 按照格式對輸出進行轉換, 並寫到標准輸出流中(stdin),后面的三個點  . . . 表示此處的參數是可變參數,這樣可以滿足不同的輸出需求

 如果打印輸出成功函數返回打印的字節數(函數返回值為  int  類型), 如果出錯則返回一個負值

1 #include <stdio.h>
2 
3 int main()
4 { 5 int i = printf("你好\n"); 6 printf("%d\n", i); 7 return 0; 8 }

 輸出

你好
5

 成功輸出   你好  並且返回打印的字符個數  5  (一個漢字的編碼占2個字節 * 2 + '\n'一個字節  = 5)

格式串由兩種類型對象組成:

----- 普通字符(將被復制到輸出流中)

----- 轉換說明(分別決定下一個后續參數的轉換和打印), 每個轉換說明均以 % 開頭, 以轉換字符結束, 在%與轉換字符之間可以一次包括下列內容

  • 標志

         -   指定被轉換的參數在其字段內左對齊

1 #include <stdio.h>
2 
3 int main()
4 {
5     printf("%20s\n", "hello world\n");
6     printf("%-20s\n", "hello world\n");
7     return 0;
8 }

              輸出

        hello world

hello world

            +  只定在輸出的數前面加上正負號

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int i = printf("%20s\n", "hello world\n");
 6     printf("%d\n", i);
 7     printf("%+d\n", i);
 8     printf("%+d\n", -i);
 9     return 0;
10 }

            輸出

        hello world

21
+21
-21

            空格  如果第一個字符不是正負號, 則在它的前面加上空格

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int i = printf("%20s\n", "hello world\n");
 6     printf("%d\n", i);
 7     printf("%+d\n", i);
 8     printf("%+d\n", -i);
 9     printf("%+ d\n", -i);
10     printf("% d\n", i);
11     return 0;
12 }

             輸出

        hello world

21
+21
-21
-21
 21

              0  對於數制轉換, 當輸出長度小於字段寬度時, 在前面添加 0 作為填充

1 #include <stdio.h>
2 
3 int main()
4 {
5     int i = printf("%20s\n", "hello world\n");
6     printf("%06d\n", i);
7     return 0;
8 }

            輸出

        hello world

000021

            #  指定另一種輸出格式。 如果為 o 則第一個數字為0(表示八進制), 如果為 x 或 X , 則指定在輸出的非0值前加 0x 或 0X (表示十六進制)

1 #include <stdio.h>
2 
3 int main()
4 {
5     int i = printf("你好!!!\n");
6     printf("%#o\n", i);
7     return 0;
8 }

           輸出

你好!!!
010

           共 8 個字節, 八進制是  010

1 #include <stdio.h>
2 
3 int main()
4 {
5     int i = printf("!!!!!!你好!!!!!\n");
6     printf("%#x\n", i);
7     printf("%#X\n", i);
8     return 0;
9 }

           輸出

!!!!!!你好!!!!!
0x10
0X10

            共 16 個字節, 十六進制是  0x10

  • 一個數值, 用於指定最小字段寬度
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     printf("%d\n", 8);
 6     printf("%d\n", 9);
 7     printf("%d\n", 10);
 8     printf("%6d\n", 8);
 9     printf("%6d\n", 9);
10     printf("%6d\n", 10);
11     return 0;
12 }

           輸出

8
9
10
     8
     9
    10

 當然這里默認是右對齊的

  • 點號,用於分隔字段寬度和精度
  • 表示精度的數
1 #include <stdio.h>
2 #define PI 3.1415926535897932384626433832795028841971693993751058209
3 int main()
4 {
5     printf("%30.20f\n", PI);
6 }

 輸出

        3.14159265358979310000

可以看出雙精度浮點型可以精確到小數點后 16 位左右

         -------------------  寬度和精度中任何一個或者兩個都可以用 * 代替, 通過轉換下一個參數計算得到(下一個參數必須為 int 類型

1 #include <stdio.h>
2 #define PI 3.1415926535897932384626433832795028841971693993751058209
3 int main()
4 {
5     int a = 30, b = 20;
6     printf("%*.*f\n", a, b, PI);
7 }

當然結果和上面一樣

  • 長度修飾符 h , l 或 L 。

          h:將相應的參數按照 short 或 unsigned short 類型輸出

          l:將相應的參數按照 long 或 unsigned long 類型輸出

          L:將相應的參數按照 long double 類型輸出


 printf 函數的轉換字符(以 % 開頭, 如果 % 后面的字符不是轉換字符, 則它行為沒有定義)

轉換字符 參數類型, 轉換結果
d, i int, 有符號十進制表示
o unsigned int, 無符號八進制表示(無前導0)
x, X unsigned int, 無符號十六進制表示(無前導0x和0X)。如果是0x, 則使用abcdef, 如果是0X, 則使用ABCDEF
u int, 無符號十進制表示
c int, 轉換為unsigned char類型后為一個字符
s char *, 打印字符串中的字符, 知道遇到 '\0' 或者已經打印了有精度指定的字符數
f double, 形式為 [-]mmm.ddd 的十進制表示, 其中, d的數目由精度確定, 默認精度為6, 精度為0時不輸出小數點
e, E double, 形式為 [-]m.dddddd   e (+/-) xx 或 [-]m.dddddd   E (+/-) xx 的十六進制表示, d的數目由精度確定, 默認為6, 精度為0時不輸出小數點
g, G double, 當指數小於 -4 或大於等於精度時, 采用 %e 或 %E 的格式, 否則采用 %f 的格式, 尾部的0與小數點不打印
p void *, 打印指針值(具體表示方式與實現有關)
n int *, 到目前為止, 此printf調用輸出的字符的數目將被寫入到相應參數中, 不進行參數轉換
% 不進行參數轉換, 打印一個符號 %


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM