printf 函數

上一篇以 hello world 程序開始,hello world 程序核心主體只有一句話:windows

printf("Hello world!");

若是須要輸出一些變量,能夠使用 "%d", "%s", "%c" 等,傳入對應變量輸出。函數

int main()
{
    int i = 10;
    char *s = "Kylin";
    char c ='u';
    printf("Hello world, %d, %s, %c\n!", i, s, c);
    return 0;
}

咱們來看一下printf 原型spa

_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);
extern int printf (const char *__restrict __format, ...);

以上爲 windows (VS2012) 和 Linux 中的不一樣原型聲明,忽略VS中 _Check_return_opt_, __cdecl 等,兩個形式是同樣的,第一個參數都是 const char* 類型,後續參數爲」...」。設計

VS的聲明中, __cdecl 涉及到C 和 C++ 中的函數調用方式 (cd call, std call 等),咱們後續會詳細分析。rest

printf函數的可變參數

像 printf 函數,咱們不知道調用者會傳入多少須要輸出的變量,最初的函數設計者能想到兩種方案:code

  1. 固定最大支持的參數數目(如 256),爲每一個可能定義不一樣的函數:這樣 stdio.h 中會有256個支持 print 的函數, print0, print1.....print255 (這時候尚未C++,沒有同名函數重載的概念)
  2. 定義一個函數,讓它支持可變參數

傳說計算機是爲懶人發明的,相似print 的這種函數還會有不少,咱們必定會選擇第二種方案。orm

C語言爲咱們提供了 va_list 來支持可變參數。blog

下邊會給出一個僞代碼實現 printf 函數中,處理可變參數部分字符串

va_list arg;
va_start(arg,str);
/*
對可變參數作處理,
在printf 中,主要是處理"%d, %f "等
*/
switch(c)
    case: 's':
    poutstr = va_arg(arg,char*);
    break;
..........

va_end(arg);

printf 函數的可變參數解決了,下一步須要處理的是 printf 中的格式化信息。原型

printf 用法

除了自己須要打印出來的字符串,輸出的變量的方式爲

"%[FLAG][WIDTH][.PRECISION]type"

除了type, 其他使用 [] 的爲可選參數.

咱們先看一下 type 參數的列表

type參數

 

上圖爲複製他人博客中的表格

FLAG 參數

 "-"     結果左對齊,右邊填空格。默認是右對齊,左邊填空格。

"+"     輸出符號

" "      輸出值爲正時加上空格,爲負時加上負號

"#"      type是o、x、X時,增長前綴0、0x、0X.    type是a、A、e、E、f、g、G時,必定使用小數點。默認的,若是使用.0控制不輸出小數部分,則不輸出小數點。type是g、G時,尾部的0保留

"0"      將輸出的前面補上0,直到佔滿指定列寬爲止

WIDTH 參數

示例:

printf("%07d",1000);輸出:0001000

printf("%0*d",7,1000);輸出:0001000

PRECISION 參數

 通常用於輸出 float 類型時,顯示指定保留的精度。

 

本文簡單介紹了 C 語言的 printf 函數。printf 中還包含一個函數調用方式會在後續的文章中說明。

相關文章
相關標籤/搜索