printf用法大全,C語言printf格式控制符一覽表

2020-07-16 10:04:19
輸入輸出函數(printf 和 scanf)是C語言中非常重要的兩個函數,也是學習C語言必學的兩個函數。在C語言程式中,幾乎沒有一個程式不需要這兩個函數,尤其是輸出函數(printf),所以這兩個函數必須要掌握。

如果在程式中要使用 printf 或者 scanf,那麼就必須要包含標頭檔案 stdio.h。因為這兩個函數就是包含在該標頭檔案中的。

輸出函數的功能是將程式執行的結果輸出到螢幕上,而輸入函數的功能是通過鍵盤給程式中的變數賦值。可以說輸入輸出函數是使用者和計算機互動的介面。其中 printf 的功能很強大,用法很靈活,比較難掌握;而 scanf 的用法相對比較固定,但也有很多需要注意的地方。

本節我們先講解 printf 的用法,稍後再講解 scanf。

printf 的格式

printf 函數的原型為:

# include <stdio.h>
int printf(const char *format, ...);

在講每一個函數的時候都會先把它的函數原型寫出來,這個原型你們現在看不懂不要緊,等到學完C語言之後再來看這個原型就會發現它是很有參考意義的!它對深刻理解函數有著很大的價值。

printf 的格式有四種:

1) printf("字串n");

# include <stdio.h>
int main(void)
{
    printf("Hello World!n");  // n表示換行
    return 0;
}
其中n表示換行的意思。它是一個跳脫字元,前面在講字元常數的時候見過。其中 n 是“new line”的縮寫,即“新的一行”。

此外需要注意的是,printf 中的雙引號和後面的分號必須是在英文輸入法下。雙引號內的字串可以是英文,也可以是中文。

2) printf("輸出控制符",輸出引數);

# include <stdio.h>
int main(void)
{
    int i = 10;
    printf("%dn", i);  /*%d是輸出控制符,d 表示十進位制,後面的 i 是輸出引數*/
    return 0;
}
這句話的意思是將變數 i 以十進位制輸出。

那麼現在有一個問題:i 本身就是十進位制,為什麼還要將 i 以十進位制輸出呢?

因為程式中雖然寫的是 i=10,但是在記憶體中並不是將 10 這個十進位制數存放進去,而是將 10 的二進位制程式碼存放進去了。計算機只能執行二進位制 0、1 程式碼,而 0、1 程式碼本身並沒有什麼實際的含義,它可以表示任何型別的資料。所以輸出的時候要強調是以哪種進位制形式輸出。所以就必須要有“輸出控制符”,以告訴作業系統應該怎樣解讀二進位制資料。

如果是%x就是以十六進位制的形式輸出,要是%o就是以八進位制的形式輸出,大家自己試一下。

3) printf("輸出控制符1 輸出控制符2…", 輸出引數1, 輸出引數2, …);

# include <stdio.h>
int main(void)
{
    int i = 10;
    int j = 3;
    printf("%d %dn", i, j);
    return 0;
}
輸出控制符 1 對應的是輸出引數 1,輸出控制符 2 對應的是輸出引數 2……編譯、連結、執行後我們看一下輸出結果:
10 3

注意一下,為什麼 10 和 3 之間有一個空格?因為上面 %d 和 %d之間有空格,printf 中雙引號內除了輸出控制符和跳脫字元n外,所有其餘的普通字元全部都原樣輸出。比如:
# include <stdio.h>
int main(void)
{
    int i = 10;
    int j = 3;
    printf("i = %d, j = %dn", i, j);
    return 0;
}
這時我們再編譯、連結、執行一下:
i = 10, j = 3

i=,、空格和j=全都原樣輸出了。此外需要注意的是:“輸出控制符”和“輸出引數”無論在“順序上”還是在“個數上”一定要一一對應。

4) printf("輸出控制符 非輸出控制符",輸出引數);

這實際上就是上面那個例子。這時候會有一個問題:到底什麼是“輸出控制符”,什麼是“非輸出控制符”?很簡單,凡是以%開頭的基本上都是輸出控制符。

輸出控制符

常用的輸出控制符主要有以下幾個:
控制符 說明
%d 按十進位制整型資料的實際長度輸出。
%ld 輸出長整型資料。
%md m 為指定的輸出欄位的寬度。如果資料的位數小於 m,則左端補以空格,若大於 m,則按實際位數輸出。
%u 輸出無符號整型(unsigned)。輸出無符號整型時也可以用 %d,這時是將無符號轉換成有符號數,然後輸出。但程式設計的時候最好不要這麼寫,因為這樣要進行一次轉換,使 CPU 多做一次無用功。
%c 用來輸出一個字元。
%f 用來輸出實數,包括單精度和雙精度,以小數形式輸出。不指定欄位寬度,由系統自動指定,整數部分全部輸出,小數部分輸出 6 位,超過 6 位的四捨五入。
%.mf 輸出實數時小數點後保留 m 位,注意 m 前面有個點。
%o 以八進位制整數形式輸出,這個就用得很少了,了解一下就行了。
%s 用來輸出字串。用 %s 輸出字串同前面直接輸出字串是一樣的。但是此時要先定義字元陣列或字元指標儲存或指向字串,這個稍後再講。
%x(或 %X 或 %#x 或 %#X) 以十六進位制形式輸出整數,這個很重要。

%x、%X、%#x、%#X 的區別

一定要掌握 %x(或 %X 或 %#x 或 %#X),因為偵錯的時候經常要將記憶體中的二進位制程式碼全部輸出,然後用十六進位制顯示出來。下面寫一個程式看看它們四個有什麼區別:
# include <stdio.h>
int main(void)
{
    int i = 47;
    printf("%xn", i);   
    printf("%Xn", i);   
    printf("%#xn", i);   
    printf("%#Xn", i);   
    return 0;
}
在 VC++ 6.0 中的輸出結果:
2f
2F
0x2f
0X2F

從輸出結果可以看出:如果是小寫的x,輸出的字母就是小寫的;如果是大寫的X,輸出的字母就是大寫的;如果加一個#,就以標準的十六進位制形式輸出。

最好是加一個#,否則如果輸出的十六進位制數正好沒有字母的話會誤認為是一個十進位制數呢!總之,不加#容易造成誤解。但是如果輸出 0x2f 或 0x2F,那麼人家一看就知道是十六進位制。而且%#x%#X中,筆者覺得大寫的比較好,因為大寫是絕對標準的十六進位制寫法。

如何輸出 %d、 和雙引號

printf 中有輸出控制符%d,跳脫字元前面有反斜槓,還有雙引號。那麼大家有沒有想過這樣一個問題:怎樣將這三個符號通過 printf 輸出到螢幕上呢?

要輸出%d只需在前面再加上一個%,要輸出只需在前面再加上一個,要輸出雙引號也只需在前面加上一個即可。程式如下:
# include <stdio.h>
int main(void)
{
    printf("%%dn");
    printf("n");
    printf("""n");
    return 0;
}
在 VC++ 6.0 中的輸出結果是:
%d

""

小結

printf 是C語言中非常重要的一個函數。經過上面的學習我們發現,其實它並不難。只要多程式設計多練習,很快就能掌握。

其次學完本節之後要知道為什麼需要“輸出控制符”。因為計算機中所有的資料都是二進位制 0、1 程式碼,所以輸出的時候要用“輸出控制符”告訴計算機以什麼形式將二進位制資料顯示出來。

輸出控制符中,%d、%f、%s、%c 是最常用的,它們分別是輸出整數、實數、字串和字元的控制符。%.mf 雖然用得不多,但一定要重視。

最後 %x、%X、%#x、%#X 四種用法的區別只需要了解一下即可。