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

VS2013 中 scanf 使用錯誤的兩種解決方案

     編輯:程式設計疑難解答

錯誤原因

VS 編譯器默認啟用安全檢查,認為 scanf 不安全(緩衝區溢出風險),要求使用 scanf_s 或定義宏 _CRT_SECURE_NO_DEPRECATE 抑制警告/錯誤。

錯誤提示截圖 項目屬性設置 代碼示例 運行結果

方案一:宏定義禁用检查(推荐用于快速移植旧代码)

  1. 右鍵項目 → 屬性 (Alt+F7)。
  2. 配置屬性 → C/C++ → 預處理器。
  3. 在 預處理器定義 末尾添加 _CRT_SECURE_NO_DEPRECATE。
  4. 確定,重新編譯。

方案二:使用 scanf_s(推荐用于新代码/安全要求高的项目)

scanf_s 需為每個 %c、%s、%[ 格式指定符提供緩衝區大小參數。

// 原代碼
scanf("%d,%d", &a, &d);

// 修正為 scanf_s(%d 不需緩衝區大小,但微軟文檔建議統一加上)
scanf_s("%d,%d", &a, &d); // 實際上 %d 不需要大小參數,直接這樣寫即可
// 若讀取字符串:
char buf[20];
scanf_s("%19s", buf, (unsigned)_countof(buf)); // 必須指定最大讀取長度

注意:原帖給出的 scanf_s("%d,%d",1,&a,1,&d) 寫法錯誤(多傳了兩個 1),%d 對應 int* 只需傳地址。

最佳實踐建議

  • 新項目優先使用 scanf_s 或 C++ 流(std::cin)。
  • 舊代碼移植時,全局定義宏最省力,但需評估安全風險。
  • 跨平台代碼建議封裝輸入函數,內部用 #ifdef _MSC_VER 區分調用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved