補充上篇:scanf("%c", &ch) **不會**跳過空白字符(含換行符),每次調用精確讀取緩衝區下一字節。
#include <stdio.h>
int main() {
char ch1, ch2, ch3, ch4;
scanf("%c", &ch1); // 輸入 'h' + Enter → ch1='h',緩衝區剩 '\n'
scanf("%c", &ch2); // 直接讀 '\n' → ch2='\n'
scanf("%c", &ch3); // 等待新輸入
scanf("%c", &ch4);
printf("ch1=%c ch2=%c ch3=%c ch4=%c\n", ch1, ch2, ch3, ch4);
return 0;
}
輸入:h⏎ ⏎ a⏎ b⏎
輸出:ch1=h ch2=
ch3=a ch4=b
可見 ch2 吸收了第一次 Enter 留下的換行符。
scanf("%s")%s:跳過前導空白,讀取非空白序列,**留下後續空白**。%c:**不跳過**,原樣讀取下一字節(含空白)。%[^\n]:掃描集,讀取直到換行,**留下換行符**。// 讀取單個非空白字符,自動跳過殘留換行/空格
scanf(" %c", &ch); // 格式串前加空格!
// 讀取整行(含空格)
fgets(buf, sizeof(buf), stdin);
buf[strcspn(buf, "\n")] = 0; // 去換行