在 Visual Studio 2013(及更新版本)中使用 scanf_s 讀取單一字元(%c)時,若未指定緩衝區大小,程式雖能編譯通過,但執行時無法正確讀取輸入,導致後續 printf 輸出異常。
#include <stdio.h>
int main() {
char a;
scanf_s("%c", &a); // 缺少緩衝區大小參數
printf(" %c\n", a);
return 0;
}
scanf_s 是 Microsoft 強化版的安全函式,要求對於 %c、%s、%[ 等格式,必須在對應參數後額外傳入緩衝區大小(以字元數為單位)。若省略,行為未定義,通常導致讀取失敗。
scanf_s("%c", &a, 1); // 第三個參數指定緩衝區大小為 1 個字元
%s,需傳入陣列總大小:scanf_s("%s", buf, sizeof(buf))。scanf 不需要此參數,但 VS 編譯器預設會對 scanf 發出警告(C4996),建議專案設定中定義 _CRT_SECURE_NO_WARNINGS 宏以繼續使用標準函式,或全面改用 scanf_s 並正確傳遞大小參數。scanf 搭配寬度限制(如 %19s),避免緩衝區溢位。專案屬性 → C/C++ → Preprocessor → Preprocessor Definitions 加入 _CRT_SECURE_NO_WARNINGS,即可壓制 scanf 警告,直接用標準寫法。
掌握 scanf_s 的參數規則,能避免 VS 環境下常見的輸入讀取失敗問題。