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

C語言 printf 格式化輸出深度解析:%*s 動態寬度控制完全指南

     編輯:關於C語言

%*s 核心語法

printf("%*s", width, str) 中:

  • * 表示寬度由參數指定(而非格式字符串常量)
  • width 為整數,指定最小輸出寬度
  • str 為字符串指針
  • 不足寬度時 左側填充空格(右對齊)

實戰演示

#include <stdio.h>

int main() {
    char *s = "12345";
    char c = 'a';
    
    printf("|%*s|\n", 10, s); // 輸出:|     12345| (5空格+5字符=10)
    printf("|%*c|\n", 4, c);   // 輸出:|   a| (3空格+1字符=4)
    
    // 等價於
    printf("|%10s|\n", s);
    printf("|%4c|\n", c);
    return 0;
}

%*s%s 組合用法

printf("%*s%s", 5, "prefix", "content");
// 效果:先輸出寬度 5 右對齊的 "prefix",再直接拼接 "content"
// 若 "prefix" 長度 ≥ 5,則無填充直接拼接

進階:動態對齊表格

void print_table(const char *cols[], int n, int widths[]) {
    for (int i = 0; i < n; i++)
        printf("%-*s", widths[i], cols[i]); // %- 左對齊
    printf("\n");
}

int main() {
    const char *hdr[] = {"ID", "Name", "Score"};
    int w[] = {5, 15, 8};
    print_table(hdr, 3, w);
    // 輸出:ID   Name            Score
    return 0;
}

常見誤區

  • ❌ %*s 後緊跟字符串常量會被誤認為格式串 → 使用 printf("%*s%s", w, "", str) 或分開輸出
  • ❌ 寬度為負數時行為未定義(C99 規定負寬度等同於 %-*s 左對齊)
  • ✅ 寬度參數類型為 int,超大值可能導致棧溢出

總結

%*s 是 C 語言格式化輸出的「動態寬度」利器,配合 %-*s 左對齊、%.*s 精度控制,可構建整齊的表格、日志、進度條等輸出。掌握「寬度參數化」思想,能大幅提升輸出代碼的靈活性與可維護性。

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