使用 scanf("%c", &c[0]) 讀取單個字符時,程序直接跳過輸入,不等待用戶操作。典型代碼如下:
scanf("%s", b); // 讀取字符串
scanf("%c", &c[0]); // 本意讀取單字符,實際跳過
scanf("%s") 讀取字符串時,遇空格、換行、製表符結束,但將結束符(如換行符 '\n')留在標準輸入緩衝區。隨後的 %c 直接讀取該殘留換行符,導致看似「跳過輸入」。
scanf(" %c", &c[0]); // %c 前的空格會自動跳過所有空白字符
// Windows (MSVC)
fflush(stdin); // 非標準,但 MSVC 支援
// 跨平台標準做法:讀取並丟棄至換行符
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
整行讀取後再解析,完全避開緩衝區殘留問題:
char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%c", &c[0]);
%s 和 %c 時,務必在 %c 前加空格。fflush(stdin),移植性差。fgets 讀行,再用 sscanf 解析,健壯性最強。scanf 留下的換行符是導致 %c 跳過輸入的元兇。在格式符前加空格 " %c" 是最簡潔、標準的修復方式。