C 語言無內建「表格」資料結構,但透過 printf 格式化輸出可輕鬆產生對齊整齊的文字表格。
| 格式 | 含義 | 範例輸出 |
|---|---|---|
%10d | 寬度 10,右對齊,不足前補空格 | " 1" (9空格+1) |
%-10d | 寬度 10,左對齊,不足後補空格 | "1 " |
%10s | 字串寬度 10,右對齊 | " hello" |
%-10s | 字串寬度 10,左對齊 | "hello " |
%10.2f | 寬度 10,小數 2 位,右對齊 | " 3.14" |
%05d | 寬度 5,不足前補 0 | "00042" |
#include <stdio.h>
typedef struct {
int id;
char name[20];
int score;
} Student;
int main() {
Student students[] = {
{1001, "張三", 85},
{1002, "李四", 92},
{1003, "王五", 78},
{1004, "趙六", 96},
};
int n = sizeof(students) / sizeof(students[0]);
// 表頭
printf("%-6s %-10s %6s\n", "學號", "姓名", "成績");
printf("------------------------------\n");
// 資料列
for (int i = 0; i < n; ++i) {
printf("%-6d %-10s %6d\n",
students[i].id,
students[i].name,
students[i].score);
}
// 統計列
int sum = 0;
for (int i = 0; i < n; ++i) sum += students[i].score;
printf("------------------------------\n");
printf("%-6s %-10s %6.2f\n", "", "平均", (double)sum / n);
return 0;
}
學號 姓名 成績
------------------------------
1001 張三 85
1002 李四 92
1003 王五 78
1004 趙六 96
------------------------------
平均 87.75
int max_name_len = 4; // "姓名" 長度
for (int i = 0; i < n; ++i) {
int len = strlen(students[i].name);
if (len > max_name_len) max_name_len = len;
}
// 使用 * 動態寬度
printf("%-*s", max_name_len, "姓名"); // * 從引數取寬度
// 需終端機支援 UTF-8
printf("┌──────┬──────────┬──────┐\n");
printf("│ %-4s │ %-8s │ %4s │\n", "學號", "姓名", "成績");
printf("├──────┼──────────┼──────┤\n");
for (int i = 0; i < n; ++i) {
printf("│ %-4d │ %-8s │ %4d │\n", students[i].id, students[i].name, students[i].score);
}
printf("└──────┴──────────┴──────┘\n");
printf("學號,姓名,成績\n");
for (int i = 0; i < n; ++i) {
printf("%d,%s,%d\n", students[i].id, students[i].name, students[i].score);
}
#define PRINT_ROW(fmt, ...) printf(fmt "\n", __VA_ARGS__)
PRINT_ROW("%-6d %-10s %6d", id, name, score);
| 問題 | 原因 | 解決 |
|---|---|---|
| 中文對齊錯亂 | 中文字元寬度為 2 格,printf 按位元組計寬度 | 預留雙倍寬度,或用 wprintf + setlocale、或輸出 CSV 由 Excel 對齊 |
| 負數對齊偏移 | 負號佔 1 字元寬度 | 寬度預留 1 位,或用 %+d 強制顯示正號 |
| 浮點數小數位不固定 | 未指定精度 | %.2f 強制 2 位小數 |
| 超長字串截斷 | %10s 不截斷,超寬會破版 | %.10s 限制最大寬度,或預先截斷 |
C 語言「製表」本質是 printf 格式化輸出的寬度、對齊、精度控制。掌握 %-Ns (左對齊)、%Nd (右對齊)、%.Mf (小數位)、* (動態寬度),即可輸出專業級文字表格。中文環境建議輸出 CSV 由試算軟體處理,或使用支援 Unicode 寬度計算的庫(如 libunistring)。