char ch;
scanf_s("%c", &ch); // VC++ 專用安全版本
scanf_s("%d%d", &n, &m);
輸入字元按 Enter 後,程式似乎卡住或跳過後續輸入。
scanf_s("%c") 讀取字元,換行符 '\n' 留在 stdin。第二次 scanf_s("%d") 遇到 '\n' 視為空白略過,但若格式不匹配則失敗。scanf_s("%c", &ch) 需第三參數 sizeof(ch),否則編譯警告/執行時錯誤。// 方法 1:加空白吃掉空白字元(推薦)
scanf_s(" %c", &ch, sizeof(ch)); // 格式字串前加空格
// 方法 2:額外讀取換行符
scanf_s("%c", &ch, sizeof(ch));
getchar(); // 吞掉 '\n'
// 方法 3:改用 fgets + sscanf 完整讀行解析(最穩健)
char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%c", &ch);
| 特性 | scanf | scanf_s (MSVC) |
|---|---|---|
| 標準 | C99/C11 | Microsoft 擴充 (C11 Annex K) |
| %c/%s/%[ | 無需大小 | 必須提供緩衝區大小 |
| 跨平台 | 是 | 否 (需 _CRT_SECURE_NO_WARNINGS) |
scanf,避免尺寸參數困擾。scanf_s 並嚴格傳遞大小,或改用 fgets/sscanf 組合完全掌控輸入流。" %c",自動跳過所有空白字元(含換行、空格、Tab)。理解 stdin 緩衝區機制與 scanf_s 介面契約,是避免 C 輸入處理「卡住」的關鍵。