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

C 語言 scanf_s 缺少緩衝區大小參數導致編譯錯誤

     編輯:程式設計疑難解答

錯誤代碼

scanf_s("%s", name);  // 錯誤:%s 格式需緩衝區大小

正確寫法

char name[40];
scanf_s("%s", name, (unsigned)sizeof(name));  // 或 40
// 或者
scanf_s("%39s", name);  // 寬度限制,但仍建議傳大小

原因

scanf_s 是 C11 標準庫(Microsoft 實現)的安全版本,**所有 %s、%c、%[ 格式必須緊跟緩衝區大小參數**(rsize_t 類型),防止緩衝區溢出。

對比表

函數%s 參數個數安全性適用場景
scanf1 (地址)無保護標準 C、跨平台
scanf_s2 (地址, 大小)運行時檢查Windows/MSVC、安全要求高

最佳實踐

  • 跨平台項目優先用 fgets(name, sizeof(name), stdin) + 去換行,完全避開 scanf 系列問題。
  • 必須用 scanf_s 時,**務必傳遞緩衝區大小**,否則編譯報錯 C4473 / 運行崩潰。

總結

scanf_s("%s", name, sizeof(name)) 才是正確姿勢。記住:安全版掃描函數要求顯式緩衝區大小,這是為了防止緩衝區溢出漏洞。

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