VS2017中'scanf': This function or variable may be unsafe.報錯
今天在使用 VS 2017 編譯一段 C 程式碼的時候,出現 “error C4996: ‘scanf’: This function or variable may be unsafe.” 的報錯。同樣的一段程式碼在Dev cpp中成功編譯執行。
報錯
for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &a[i][j]);
報錯出現在scanf
處。
解決方案
方案一
將scanf
改為scanf_s
方案二
使用#define _CRT_SECURE_NO_WARNINGS
巨集定義
方案三
在 VS 中新建專案的時候去掉“安全開發生命週期(SDL)檢查”即可將錯誤轉變成警告
方案四
在標頭檔案中加入#pragma warning(disable:4996)
原因
因為scanf
函式不檢查邊界,因此很容易出現記憶體洩漏的問題,如:
char s[3]; scanf("%s", &s);
如果我輸入一段超過3個位元組的字串,由於s只有3個位元組的長度,剩下的文字就寫入了s後面的其他空間,出現緩衝區溢位。而_s字尾的函式,會有額外的引數,用來說明緩衝區的長度.比如:
scanf_s("%s", &s, 3);
因此,微軟在新版的 VS 中強制使用安全的scanf_s
參考資料
關於scanf_s
的更多細節:http://code.wikia.com/wiki/Scanf_s