許多初學者在連續呼叫 scanf("%s", a) 和 gets(b) 時,發現程式未等待輸入直接跳過 gets(b)。根源在於兩者對「白字元」(空格、換行、製表符)的處理機制截然不同。
\0。\n 或 EOF。char a[20], b[20], c[20];
scanf("%s", a); // 輸入 "hello world\n" -> a="hello", 緩衝區剩 " world\n"
gets(b); // 直接讀取 " world" (含前導空格),丟棄 \n,b=" world"
gets(c); // 緩衝區已空,正常等待輸入 c
結果:b 讀到了「垃圾資料」(殘留的空格和 world),且未提示輸入。
fflush(stdin)C 標準未定義對輸入流的 fflush 行為。僅 MSVC 支援,GCC/Clang 會報錯或無效,嚴禁跨平台專案使用。
fgets 替代使用 fgets(buf, size, stdin) 讀取整行,再用 sscanf 解析,或手寫解析邏輯。fgets 會保留 \n(若空間允許),便於判斷輸入完整性,且標準保證跨平台一致。
scanf("%c")%c 不跳過白字元,直接讀取緩衝區下一個字元(含 \n)。若需跳過白字元讀取非空白字元,請用 scanf(" %c", &ch)(格式字串前加空格)。
fgets + sscanf/手動解析,避免混用 scanf/gets。CLEAR_BUF()(見上文)。gets(C11 已移除),改用 fgets 防止緩衝區溢位。