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

VS2010 編譯通過 VS2015 報錯 C4996:scanf 不安全的解決方案

     編輯:程式設計綜合問答

錯誤信息


error C4996: 'scanf': This function or variable may be unsafe.
Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

原因

VS2015(MSVC 14.0)加強了 CRT 安全檢查,scanf、strcpy 等標準 C 函數被標記為棄用,推薦使用帶 `_s` 後綴的安全版本(如 scanf_s)。

三種解決方案

方案一:項目層面禁用警告(最快,推舊代碼)

  1. 右鍵項目 → Properties(屬性)。
  2. C/C++ → Preprocessor → Preprocessor Definitions 添加 _CRT_SECURE_NO_WARNINGS。
  3. 或在代碼最開頭(所有 include 之前)加入:
    #define _CRT_SECURE_NO_WARNINGS
    

方案二:新建項目時關閉 SDL 檢查(推薦新項目)

新建項目對話框

  1. File → New → Project → Windows Desktop → Windows Desktop Wizard。
  2. 取消勾選 Security Development Lifecycle (SDL) checks。

方案三:改用安全函數(最規範,需修改代碼)

不安全函數安全替代關鍵差異
scanf("%d", &a)scanf_s("%d", &a)格式串相同,部分函數需傳緩衝區大小
scanf("%s", str)scanf_s("%s", str, (unsigned)_countof(str))**必須傳緩衝區長度**(字符數,非字節數)
strcpy(dst, src)strcpy_s(dst, size, src)需傳目標緩衝區大小

遷移提示

  • scanf_s 的 %s/%c/%[ 格式**強制要求**額外參數指定緩衝區大小,否則編譯報錯。
  • 跨平台項目建議封裝宏:
    
    #if defined(_MSC_VER)
    #define MY_SCANF scanf_s
    #else
    #define MY_SCANF scanf
    #endif
    
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved