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;
}
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) 或分開輸出%-*s 左對齊)int,超大值可能導致棧溢出%*s 是 C 語言格式化輸出的「動態寬度」利器,配合 %-*s 左對齊、%.*s 精度控制,可構建整齊的表格、日志、進度條等輸出。掌握「寬度參數化」思想,能大幅提升輸出代碼的靈活性與可維護性。