getchar() 從標準輸入讀取單一字元,但初學者常遭遇「跳過輸入」現象。根因在於輸入流的行緩衝特性:使用者輸入字元後按 Enter,實際送入緩衝區的是 '字元' + '\n' 兩個字元。若後續呼叫 gets() 或 scanf("%c"),會直接讀取殘留的 '\n' 導致邏輯錯誤。
char a, b[10], c[10];
scanf("%c", &a); // 輸入 'x' + Enter → 緩衝區: 'x', '\n'
gets(b); // 直接讀到 '\n',b 變成空字串
gets(c); // 才真正等待使用者輸入
getchar() 吞噬換行符scanf("%c", &a); getchar(); // 吃掉 '\n'scanf 格式字串加入空白或 \nscanf("%c\n", &a); 或 scanf(" %c", &a);(前導空白會跳過所有空白字元)fgets() 讀整行再解析,避免混用格式化與行讀取函數。使用者輸入: a Enter b Enter c Enter 緩衝區內容: 'a' '\n' 'b' '\n' 'c' '\n' 讀取順序: scanf→'a' getchar→'\n' gets→'b' gets→'c'
fgets() 讀行,再用 sscanf() 解析,完全掌控緩衡區。scanf,格式字串前加空白 " %c" 跳過殘留空白字元。gets(),改用 fgets(buf, sizeof(buf), stdin)。理解「輸入流 = 字元序列」、「行緩衝 = 遇到 \n 才送達」、「混用讀取函數 = 共享同一緩衝區」三大觀念,即可徹底解決 C 語言控制台輸入的常見陷阱。