首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Visual Studio 中 scanf 報錯 C4996 解決方案:scanf_s、寬度限制與 _CRT_SECURE_NO_WARNINGS

     編輯:關於C語言

Visual Studio 中 scanf 報錯 C4996 解決方案:scanf_s、寬度限制與 _CRT_SECURE_NO_WARNINGS

錯誤現象


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 不檢查緩衝區長度,易導致溢位。

三種解決方案

1. 改用 scanf_s(Microsoft 專用)


scanf_s("%d", &i);           // 整數無需長度
scanf_s("%s", buf, (unsigned)sizeof(buf)); // 字串必須給緩衝區大小(字元數)

⚠️ 非標準 C,跨平台編譯會報錯。

2. 給 scanf 加寬度限制(標準 C,推薦)


scanf("%5d", &i);            // 最多讀 5 位數字
scanf("%99s", buf);          // 最多讀 99 字元(留 1 給 \0)

✅ 符合 C99/C11 標準,GCC/Clang/MSVC 通吃。

3. 專案層級禁用警告

專案屬性 → C/C++ → 預處理器 → 預處理器定義 添加 _CRT_SECURE_NO_WARNINGS。
或代碼開頭 #define _CRT_SECURE_NO_WARNINGS(需在 #include 之前)。

⚠️ 只是隱藏警告,不解決安全隱患,建議配合方案 2 使用。

最佳實踐建議

  1. 新代碼統一用 scanf("%99s", buf) 形式加寬度。
  2. 跨平台專案不要用 scanf_s,改用寬度限制或自寫安全封裝。
  3. 舊代碼快速遷移可暫時加 _CRT_SECURE_NO_WARNINGS,再逐步加寬度。

補充:scanf_s 字串參數陷阱


char buf[100];
scanf_s("%s", buf);              // ❌ 錯誤:缺少 size 參數
scanf_s("%s", buf, sizeof(buf)); // ✅ 正確:傳入緩衝區大小(字元數)

忘記 size 是導致運行時崩潰的常見原因。

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