首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言製表輸出技巧:printf 格式化對齊與表格列印實戰

     編輯:C 語言問答

核心技術:printf 寬度與對齊指定符

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

進階技巧

1. 動態寬度計算(適應最長資料)


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, "姓名");  // * 從引數取寬度

2. 邊框字元美化(Unicode 方塊字元)


// 需終端機支援 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");

3. CSV 輸出(供 Excel/資料庫匯入)


printf("學號,姓名,成績\n");
for (int i = 0; i < n; ++i) {
    printf("%d,%s,%d\n", students[i].id, students[i].name, students[i].score);
}

4. 多欄位對齊宏封裝


#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)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved