本文通過三個遞進式案例,串聯 C 語言最基礎的 I/O、格式化、控制流知識點:轉義字符表、printf 格式化完整演示、scanf 安全輸入、puts vs printf 對比、交互式菜單循環。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 1. 基本轉義字符演示
printf("響鈴: \a\n");
printf("退格: 123\b4\n"); // 顯示 124
printf("換頁: \f\n");
printf("回車: 行尾內容\r開頭覆蓋\n");
printf("水平制表: A\tB\tC\n");
printf("垂直制表: A\vB\vC\n");
printf("反斜槓: \\\n");
printf("問號: \?\n");
printf("單引號: \'\n");
printf("雙引號: \"\n");
// 2. 格式化輸出完整表
int num = 42;
float pi = 3.14159f;
char *str = "Hello";
char ch = 'Z';
printf("%%d 十進制: %d\n", num);
printf("%%x 十六進制: %x\n", num);
printf("%%o 八進制: %o\n", num);
printf("%%f 浮點: %f\n", pi);
printf("%%.2f 保留兩位: %.2f\n", pi);
printf("%%e 科學記數法: %e\n", pi);
printf("%%s 字符串: %s\n", str);
printf("%%c 字符: %c\n", ch);
printf("%%p 指針: %p\n", (void*)&num);
// 3. 寬度與精度控制
printf("%%10d 右對齊寬度10: %10d\n", num);
printf("%%-10d 左對齊: %-10d|\n", num);
printf("%%05d 零填充: %05d\n", num);
system("pause");
return 0;
}
#include <stdio.h>
int main() {
int a;
double b;
// 正確:雙輸入,注意 double 用 %lf
printf("輸入整數和浮點數: ");
if (scanf("%d %lf", &a, &b) == 2) {
printf("讀取成功: %d, %.4f\n", a, b);
} else {
puts("輸入格式錯誤");
}
// 類型不匹配演示
unsigned int u = -1; // 補碼全 1 → 4294967295
printf("unsigned -1 = %u\n", u);
short s = -1;
printf("short -1 用 %%d: %d\n", s); // 提升為 int,正確
printf("short -1 用 %%hd: %hd\n", s); // 顯式 short
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void show_menu() {
puts("=== 選擇操作 ===\n1. 響鈴\n2. 顯示系統時間\n3. 輸出個人信息\n0. 退出");
}
void do_action(int choice) {
switch (choice) {
case 1: printf("\a響鈴!\n"); break;
case 2: system("@echo %date% %time%"); break; // Windows 專用
case 3: puts("姓名: 張三\n年齡: 20\n專業: 計算機"); break;
default: puts("無效選項");
}
}
int main() {
int choice = -1;
do {
show_menu();
printf("請輸入選項: ");
if (scanf("%d", &choice) != 1) {
// 清理輸入緩衝區
int c; while ((c = getchar()) != '\n' && c != EOF);
choice = -1;
continue;
}
do_action(choice);
if (choice != 0) {
puts("\n按 Enter 繼續...");
getchar(); getchar(); // 吸收換行
}
} while (choice != 0);
puts("程序結束");
return 0;
}
| 特性 | puts | printf |
|---|---|---|
| 自動換行 | ✅ | ❌ 手動 \n |
| 格式化 | ❌ 只能輸出字符串 | ✅ 豐富轉換符 |
| 性能 | 快 (無解析開銷) | 較慢 |
| 返回值 | 非負=成功, EOF=失敗 | 輸出字符數, 負值=錯誤 |
| 適用場景 | 固定文本、提示信息 | 混合數據、格式化報表 |