一、printf格式化輸出
1. 整數格式化 (%d, %i, %u, %o, %x)
c復制代碼
int num = 42;
// 以下為不同格式輸出示例
printf("%d", num); // 42 (十進制)
printf("%i", num); // 42 (同%d)
printf("%u", num); // 42 (無符號十進制)
printf("%o", num); // 52 (八進制)
printf("%x", num); // 2a (小寫十六進制)
printf("%X", num); // 2A (大寫十六進制)
printf("%#x", num); // 0x2a (帶前綴)
printf("%05d", num); // 00042 (補零)
printf("%-5d", num); // "42 " (左對齊)
printf("%+d", num); // +42 (顯示符號)
2. 浮點數格式化 (%f, %e, %g)
c復制代碼
double f = 3.1415926;
// 不同格式的浮點數輸出示例
printf("%f", f); // 3.141593 (默認6位)
printf("%.2f", f); // 3.14 (保留2位)
printf("%8.3f", f); // " 3.142" (總寬8)
printf("%e", f); // 3.141593e+00 (科學計數)
printf("%.2E", f); // 3.14E+00
printf("%g", f); // 3.14159 (自動選擇)
printf("%.3g", f); // 3.14 (最多3位有效數字)
3. 字符和字符串
c復制代碼
char c = 'A';
char s[] = "Hello";
// 字符與字符串輸出示例
printf("%c", c); // A
printf("%5c", c); // " A"
printf("%s", s); // Hello
printf("%.3s", s); // Hel (截斷)
printf("%10s", s); // " Hello"
printf("%-10s", s); // "Hello "
二、scanf格式化輸入
1. 基本輸入格式
c復制代碼
int a;
float b;
char c;
char str[20];// 基本類型輸入示例
scanf("%d", &a); // 讀取整數
scanf("%f", &b); // 讀取浮點數
scanf("%c", &c); // 讀取單個字符
scanf("%s", str); // 讀取字符串(無空格)
2. 控制輸入寬度
c復制代碼
// 控制輸入寬度示例
scanf("%5d", &a); // 最多讀取5位數字
scanf("%4f", &b); // 最多讀取4位浮點數
scanf("%10s", str); // 最多讀取10個字符
3. 跳過特定輸入
c復制代碼
int day, month, year;
// 跳過特定輸入示例
scanf("%d/%d/%d", &day, &month, &year); // 輸入12/05/2023
scanf("%d - %d - %d", &day, &month, &year); // 輸入12 - 05 - 2023
scanf("%*s %d", &a); // 跳過第一個字符串,讀取第二個數字
4. 掃描集
c復制代碼
char name[50];
// 掃描集示例
scanf("%[A - Za - z]", name); // 只讀取字母
scanf("%[^\n]", str); // 讀取整行(包括空格)
三、特殊格式控制
1. printf特殊格式
c復制代碼
// printf特殊格式示例
printf("%p", &num); // 輸出指針地址
printf("%%"); // 輸出%字符
printf("%*d", 5, 10); // 寬度動態指定(5)
2. scanf特殊格式
c復制代碼
int h, m, s;
// scanf特殊格式示例
scanf("%d:%d:%d", &h, &m, &s); // 輸入12:30:45
scanf("%[0 - 9]", str); // 只讀取數字
scanf("%*[ \t\n]%c", &c); // 跳過空白字符
四、綜合示例
1. printf示例
c復制代碼
#include <stdio.h>
int main() {int id = 123;float score = 89.567;char grade = 'A';// 格式化輸出示例printf("學號:%05d 成績:%6.2f 等級:%c\n", id, score, grade);// 輸出: 學號:00123 成績: 89.57 等級:Areturn 0;
}
2. scanf示例
c復制代碼
#include <stdio.h>
int main() {int year;char model[20];float price;printf("輸入汽車信息(年份 型號 價格): ");scanf("%d %19s %f", &year, model, &price);// 格式化輸出讀取的信息printf("%d年款 %s 售價: %.2f萬元\n", year, model, price);return 0;
}
五、格式說明符對比
說明符 | printf用途 | scanf用途 |
---|---|---|
%d | 輸出有符號十進制整數 | 讀取有符號十進制整數 |
%i | 同%d | 可讀取十進制/八進制/十六進制 |
%u | 輸出無符號十進制整數 | 讀取無符號十進制整數 |
%o | 輸出八進制 | 讀取八進制 |
%x/%X | 輸出十六進制 | 讀取十六進制 |
%f | 輸出浮點數 | 讀取float |
lf | 同%f (double) | 讀取double |
%e/%E | 科學計數法輸出 | 同%f |
%g/%G | 自動選擇%f或%e | 同%f |
%c | 輸出字符 | 讀取字符 |
%s | 輸出字符串 | 讀取字符串(無空格) |
%p | 輸出指針地址 | 無 |
%[] | 無 | 掃描字符集合 |
%% | 輸出%字符 | 無 |
六、注意事項
1. printf和scanf參數區別
- printf傳遞變量值。
- scanf傳遞變量地址(&)。
2. 緩沖區問題
c復制代碼
int a; char c;
scanf("%d", &a); // 輸入后按回車
scanf("%c", &c); // 會讀取之前輸入的回車
// 解決方法: scanf(" %c", &c); (添加空格)
3. 安全性
- 使用scanf讀取字符串時務必指定寬度:
c復制代碼
char str[10];
scanf("%9s", str); // 防止緩沖區溢出
4. 返回值
- scanf返回成功讀取的項目數。
c復制代碼
if(scanf("%d %f", &a, &b)!= 2) {printf("輸入錯誤!");
}
掌握這些格式化輸入輸出方法可以讓你在C語言中更靈活地處理各種數據輸入輸出需求。