| 特性 | scanf | getchar |
|---|---|---|
| 功能定位 | 格式化輸入 | 單字元讀取 |
| 空白處理 | 自動跳過空格、Tab、換行 | 不跳過,逐字讀取含換行符 |
| 返回值 | 成功匹配項數 / EOF | 字元值 (int) / EOF |
| 典型用途 | 讀取數值、字串、格式化資料 | 讀取單鍵、清理緩衝區、互動式選單 |
scanf("%c") 吞掉換行符char a, b, c;
scanf("%c", &a); // 輸入 'q' + Enter
scanf("%c", &b); // 直接讀到 '\n',不等待輸入!
scanf("%c", &c); // 讀到 'w' + Enter → c='w'
原因:%c **不跳過空白**,上一個 Enter 留在緩衝區,下一個 %c 直接讀走。
scanf(" %c", &c) (格式字串前加空格)scanf(" %c", &a); // 空格指示:跳過任意數量空白字元
scanf(" %c", &b);
scanf(" %c", &c);
最簡潔、標準做法。
getchar() 吸收換行符scanf("%c", &a);
getchar(); // 讀走殘留的 '\n'
scanf("%c", &b);
getchar();
scanf("%c", &c);
教學常見,但較繁瑣,若輸入行有多餘空格會殘留。
fgets + sscanf (最健壯)char line[100]; fgets(line, sizeof(line), stdin); sscanf(line, "%c %c %c", &a, &b, &c);
整行讀取,完全掌控解析邏輯,避免緩衝區殘留問題。
while (getchar() != '\n'); // 讀到換行符為止
printf("Press Enter to continue...");
getchar();
int c;
while ((c = getchar()) != EOF) {
if (c >= 'a' && c <= 'z') putchar(c - 32); // 小寫轉大寫
else putchar(c);
}
輸入 x\n 時:
getchar():若緩衝區非空,直接取出首字元;若為空,阻塞等待。Enter 產生 \n,**也是字元**,一併進緩衝區。getchar() 取走 x,\n 留在緩衝區。getchar() 立即取走 \n,**不會等待新輸入**。" %c" 或改用 fgets。fgets + sscanf 徹底解決。