This function or variable may be unsafe.
Consider using scanf_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
MSVC (Visual Studio) 將標準 C 庫函數 scanf、strcpy、sprintf 等標記為**棄用/不安全**,推薦使用帶 `_s` 後綴的**安全版本**(需緩衝區大小參數),防止緩衝區溢出。
| 方式 | 代碼/設置 | 優缺點 |
|---|---|---|
| 1. 改用安全版(推薦) | scanf_s("%d", &a); scanf_s("%s", buf, (unsigned)sizeof(buf)); | 符合 MSVC 規範、可移植到 Windows 平台、需記住寬度參數 |
| 2. 宏定義關閉警告 | 文件頂部 #define _CRT_SECURE_NO_WARNINGS(在所有 #include 之前) | 快速遷移舊代碼、跨平台編譯無警告、失去編譯器緩衝區檢查保護 |
| 3. 項目屬性關閉 | Properties → C/C++ → Preprocessor → Preprocessor Definitions 添加 _CRT_SECURE_NO_WARNINGS | 全局生效、不改動源碼、同方式 2 風險 |
%c、%s、%[ **必須緊跟緩衝區大小**:scanf_s("%c", &ch, 1)、scanf_s("%s", buf, sizeof(buf))。%d、%f 等非字符串格式**不需要**大小參數。#ifdef _MSC_VER
#define SCANF_S(fmt, ...) scanf_s(fmt, __VA_ARGS__)
#else
#define SCANF_S(fmt, ...) scanf(fmt, __VA_ARGS__)
#endif
// 使用
SCANF_S("%d", &a);
SCANF_S("%s", buf, sizeof(buf)); // MSVC 展開為 scanf_s("%s", buf, sizeof(buf)),GCC 展開為 scanf("%s", buf) — 仍不安全,建議統一用 fgets/sscanf
char line[256];
if (fgets(line, sizeof(line), stdin)) {
sscanf(line, "%d", &a); // 安全、可移植、可錯誤恢復
}
VS2013 警告 scanf 不安全,**改用 scanf_s 並加寬度參數**是正規做法;臨時遷移可定義 _CRT_SECURE_NO_WARNINGS。長期建議遷移至 fgets + sscanf 或 C++ iostream,徹底規避緩衝區溢出風險。