*2.4 C 語言的格式化輸出函數 printf( )
為什麼需要「格式化」輸出?
在掌握了基本輸入、輸出之後,我們已經具備「將資料讀進電腦」,「將處理後資料送回外界」的能力,接下來重點就是中間的「處理」,也就是運算的部分。想像一下,如果你的程式計算出圓周率是 3.1415926,但你只想在螢幕上顯示 3.14;或者你希望輸出的成績單欄位能夠像表格一樣文字靠左對齊,數值靠右對齊。
首先我們要認識兩個名詞:這些都無法單純地將變數丟出來就辦到,我們需要「告訴」printf 應該用什麼「格式」來呈現資料,這就是格式化輸出的精髓。
標頭檔
要使用 printf,請務必在程式開頭引用標頭檔:
#include <cstdio>
cstdio 是指 C語言的標準輸入輸出(c standard input output)。
printf 語法與核心:「格式化字串」
printf 的語法結構如下:
printf("格式化字串", 變數1, 變數2, ...);
它的靈魂就在於第一個參數——格式化字串。這個字串由兩種內容組成:
這是最基本也最常用的幾種,我們先從它們開始。
範例 1:基本應用
#include <cstdio>
int main() {
int student_id = 101;
float score = 85.5;
char level = 'B';
printf("學生學號:%d, 分數:%.1f, 等級:%c\n", student_id, score, level);
// %.1f 的意思是浮點數只顯示到小數點後第一位
return 0;
}
執行結果:
格式化字串的各種變化與應用
接下來是今天的重頭戲。我們可以對 % 加上一些「修飾」,來精準控制輸出的樣式。
1. 控制輸出寬度 (Field Width)
我們可以指定一個數字來表示該欄位最少要佔用的寬度。如果實際內容比指定的寬度窄,預設會在左邊用空白補滿(也就是靠右對齊)。
語法:%[寬度]d、%[寬度]f ...
範例 2:讓數字整齊排列
#include <cstdio>
int main() {
int num1 = 123;
int num2 = 45;
int num3 = 6789;
printf("原始輸出:\n");
printf("%d\n", num1);
printf("%d\n", num2);
printf("%d\n", num3);
printf("\n指定寬度為 5 輸出 (靠右對齊):\n");
printf("%5d\n", num1); // 在 123 左邊補 2 個空白
printf("%5d\n", num2); // 在 45 左邊補 3 個空白
printf("%5d\n", num3); // 寬度不足 5,但數字不會被切斷,會完整顯示
return 0;
}
執行結果:
指定寬度為 5 輸出 (靠右對齊): 123 45 6789
2. 控制對齊方式 (Alignment)
如果我們想靠左對齊,只要在寬度數字前加上一個負號 - 即可。
語法:%-[寬度]d、%-[寬度]s ...
範例 3:文字的靠左與靠右
#include <cstdio>
int main() {
char product1[] = "Apple";
char product2[] = "Banana";
printf("--- 商品清單 (寬度 10) ---\n");
printf("靠右對齊: |%10s|\n", product1);
printf("靠左對齊: |%-10s|\n", product2);
printf("--------------------------\n");
return 0;
}
執行結果:
對於浮點數 (%f),我們可以用 .數字 來指定要顯示到小數點後幾位。注意:系統會自動進行四捨五入。
語法:%.[位數]f
範例 4:計算圓面積並控制精度
#include <cstdio>
int main() {
double pi = 3.1415926535;
printf("原始數值:%f\n", pi);
printf("顯示到小數點後 2 位:%.2f\n", pi); // 輸出 3.14
printf("顯示到小數點後 4 位:%.4f\n", pi); // 輸出 3.1416 (注意看,有四捨五入!)
printf("不顯示小數:%.0f\n", pi); // 輸出 3
return 0;
}
執行結果:
我們也可以將寬度和精度結合起來,創造出更完美的排版。
語法:%[總寬度].[小數位數]f
範例 5:顯示商品價格
#include <cstdio>
int main() {
float price1 = 5.99;
float price2 = 123.5;
// 總寬度為 8,小數點後 2 位
printf("價格清單 (總寬度 8):\n");
printf("|%8.2f|\n", price1);
printf("|%8.2f|\n", price2);
return 0;
}
執行結果:
解說:
總共佔 8 個字元寬,並且小數點後面固定顯示 2 位,不足的會補 0。
3. 補零 (Zero Padding)
如果希望在靠右對齊時,不是補空白而是補 0,只要在寬度數字前加上 0 即可。這常用於學號、時間等場合。
語法:%0[寬度]d
範例 6:顯示學號
#include <cstdio>
int main() {
int id1 = 7;
int id2 = 123;
printf("三年一班 座號列表:\n");
printf("補空白:%3d\n", id1);
printf("補零:%03d\n", id1); // 寬度 3,不足處補 0
printf("補零:%03d\n", id2);
return 0;
}
執行結果:
總結與速查表
以下表格提供同學們需要時查詢使用:
printf("%d", 100); → 100
%f
輸出浮點數 (float, double)。 printf("%f", 12.34); → 12.340000
%c
輸出單一字元 (char)。 printf("%c", 'A'); → A
%s
輸出字串 (char 陣列)。 printf("%s", "Hi"); → Hi
%%
輸出 % 符號本身。 printf("100%%"); → 100%
寬度控制
%[n]d
輸出寬度至少為 n 的整數,靠右對齊。printf("%4d",12); → 12
%- [n]d
輸出寬度至少為 n 的整數,靠左對齊。printf("%-4d",12); → 12
精度控制
%.[n]f
輸出浮點數,顯示到小數點後 n 位。printf("%.2f", 3.14159); → 3.14
組合使用
%[w].[p]f
總寬度為 w,小數點精度為 p。 printf("%6.2f", 3.14159); → 3.14
特殊旗標
%0[n]d
輸出寬度為 n 的整數,不足處在左邊補 0。 printf("%04d", 55); → 0055
這些符號放在字串中會有特殊功能。
練習題作業
請同學動手實作,加深對 printf 格式化的理解。
練習題 1:我的個人檔案
-
運算元(operands)目標: 練習 %s, %d, %.1f 的基本使用。 -
運算子(operator)說明: 請宣告變數來儲存姓名、年齡、身高(公尺),並依照以下格式輸出。
輸出範例:
練習題 2:商品價目表
以請使用 2+3printf 為例,格式化功能,輸出如下對齊的價目表。商品名稱欄位寬度為 10 且靠左對齊,價格欄位總寬度為 8 且顯示到小數點後 2 和 3 都是運算元,+ 是運算子。位。
我們可以把運算子想成是「運算符號」,運算元則是「運算的對象」。輸出範例:
指定(assign)運算子
練習練習題 3:數位時鐘
以下這段程式執行後,a 和 b 的值各為何?輸出範例:
int