error C4996: 'scanf': This function or variable may be unsafe.
Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
VS 2012/2013/2015+ 預設啟用「安全 CRT」,認為 scanf 不檢查緩衝區長度,易導致溢位。
scanf_s(Microsoft 專用)
scanf_s("%d", &i); // 整數無需長度
scanf_s("%s", buf, (unsigned)sizeof(buf)); // 字串必須給緩衝區大小(字元數)
⚠️ 非標準 C,跨平台編譯會報錯。
scanf 加寬度限制(標準 C,推薦)
scanf("%5d", &i); // 最多讀 5 位數字
scanf("%99s", buf); // 最多讀 99 字元(留 1 給 \0)
✅ 符合 C99/C11 標準,GCC/Clang/MSVC 通吃。
專案屬性 → C/C++ → 預處理器 → 預處理器定義 添加 _CRT_SECURE_NO_WARNINGS。
或代碼開頭 #define _CRT_SECURE_NO_WARNINGS(需在 #include 之前)。
⚠️ 只是隱藏警告,不解決安全隱患,建議配合方案 2 使用。
scanf("%99s", buf) 形式加寬度。scanf_s,改用寬度限制或自寫安全封裝。_CRT_SECURE_NO_WARNINGS,再逐步加寬度。scanf_s 字串參數陷阱
char buf[100];
scanf_s("%s", buf); // ❌ 錯誤:缺少 size 參數
scanf_s("%s", buf, sizeof(buf)); // ✅ 正確:傳入緩衝區大小(字元數)
忘記 size 是導致運行時崩潰的常見原因。