printf 採用可變參數機制,參數按順序壓入堆疊。關鍵在於:編譯器按實際類型壓棧,但 printf 按格式字串解讀。
printf("%ld %ld %ld %ld", n1, n2, n3, n4);
// 假設 n1=float, n2=double, n3=n4=long
教訓:格式字串必須與實際參數類型嚴格匹配,否則產生未定義行為。
printf 返回成功輸出的字符數,錯誤返回負數。
int a = 100;
printf("a=%d\n", a); // a=100
printf("a=%5d\n", a); // a= 100 (寬度5,右對齊)
printf("a=%-5d\n", a); // a=100 (左對齊)
printf("a=%+d\n", a); // a=+100 (顯示正號)
printf("a=% d\n", a); // a= 100 (正數前留空格)
printf("a=%#o\n", a); // a=0144 (八進制加前綴)
printf("a=%#x\n", a); // a=0x64 (十六進制加前綴)
%3d:最小寬度 3,不足左填空格%-3d:左對齊,右填空格%03d:右對齊,左填 0%-03d:0 標誌被 - 覆蓋,左對齊若首個非空白字符非數字(如 'A'),scanf 停留在該字符,不賦值,返回 0。後續調用仍從 'A' 開始。
| 格式 | 讀取內容 | 停止條件 | 空白處理 |
|---|---|---|---|
| %s | 單詞(非空白序列) | 空白或寬度限制 | 跳過前導空白 |
| %c | 單一字符 | 讀取 1 字符(或指定寬度) | 不跳過,含空白 |
%s 自動在末尾添加 '\0' 形成 C 字串。
getchar() 清理或改用 %*c%19s(緩衝區大小-1)