#include <ctype.h>
int main() {
char c;
scanf("%c\n", &c); // 格式串包含 \n
if (isupper(c)) c = tolower(c);
else c = toupper(c);
printf("%c\n", c);
return 0;
}
現象:必須輸入兩個以上字符 (如 a⏎b⏎) 程序才轉換第一個字符。
scanf 格式串中的 \n (或空格、\t) 代表匹配並跳過任意數量的空白字符。%c 讀取第一個字符 (如 'a') 存入 c。\n 要求繼續讀取輸入流,直到遇到非空白字符 為止。\n (空白),scanf 繼續等待下一個字符。'b') 並按 Enter,scanf 匹配到非空白字符 'b',將其放回輸入流,scanf 返回。c (即第一個字符 'a') 並輸出,但第二字符 'b' 殘留在緩衝區,影響後續邏輯。#include <stdio.h>
#include <ctype.h>
int main() {
char c;
scanf("%c", &c); // 移除 \n
if (isupper(c)) c = tolower(c);
else c = toupper(c);
printf("%c\n", c);
return 0;
}
| 格式符 | 對空白字符處理 | 典型用途 |
|---|---|---|
%d %f %s | 自動跳過前導空白,讀取數據後留存後續空白 | 數值、字符串輸入 |
%c | 不跳過,直接讀取下一字符 (含空白) | 單字符輸入 |
%[...] | 不跳過,掃描集匹配 | 特定字符集輸入 |
格式串中的空白 ( \n \t) | 匹配並跳過輸入流中任意數量空白字符 | 分隔符、換行吸收 |
\n 或空格:scanf("%c", &c);。scanf(" %c", &c); ( %c 前加一空格)。fgets(buf, sizeof(buf), stdin); sscanf(buf, " %c", &c); 整行讀取後解析,徹底隔離緩衝區問題。scanf("%c\n", &c) 中的 \n 導致 scanf 繼續吞噬輸入直到遇到下一個非空白字符,造成「需多輸入一字符」的假象。移除格式串中的 \n,或改用 " %c" 跳過前導空白,即可恢復預期的單字符讀取行為。