首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2013 C 語言 scanf 不安全警告:改用 scanf_s 或關閉 _CRT_SECURE_NO_WARNINGS

     編輯:程式設計綜合問答

警告信息

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 風險

scanf_s 關鍵差異

  • %c、%s、%[ **必須緊跟緩衝區大小**:scanf_s("%c", &ch, 1)、scanf_s("%s", buf, sizeof(buf))。
  • %d、%f 等非字符串格式**不需要**大小參數。
  • 返回值語義相同:成功賦值的項目數,失敗返回 EOF。

跨平台寫法建議

#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

最佳實踐:棄用 scanf 系,改用 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,徹底規避緩衝區溢出風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved