@TOC
問題描述

如圖所示,我們在使用scanf、gets、strcat等函式都存在著這樣的問題,就會有如下報錯
This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
大概意思就是意思是,scanf 這個函式或者變數可能不安全,建議考慮使用函式scanf_s,為了不顯示棄用說明(應該指的這個錯誤提示),可以使用_CRT_SECURE_NO_WARNINGS,
問題分析
C語言的標準函式中,一些讀取或寫入記憶體的函式存在記憶體越界的問題,從而使得記憶體資料變得不安全,函式scanf是標準c中的函式,在呼叫該函式時,必須提供一個數字以表明最多讀取多少位字符,其在讀取時不檢查邊界,所以可能造成記憶體訪問越界,那以scanf函式為例、看如下代碼:
#include <stdio.h>
int main()
{
int arr[3] = { 0 };//定義一個字符陣列存,開辟3個位元組的空間
scanf("%s", arr);//假如我們輸入hello world,就會導致scanf()多讀8個字符,
return 0; //則第二個l以后的部分則會被寫到別的變數所在的空間上,從而可能導致程式運行例外
printf("%s", arr);
scanf_s("%s", arr,3);以上代碼如果用scanf_s,正確代碼如前面所示表示最多讀取3個字符,函式scanf_s的最后一個引數n是緩沖區的大小,表示最多讀取n-1個字符,
}
為了防止這一問題,從VC++2005開始,微軟公司的VS提供了函式scanf_s,其功能與原版函式scanf 相同,只是后者更安全可靠,
解決辦法
提供了如scanf_s,get_s,strcat_s等相關的改進函式,來替代原來的標準函式的功能,并通過添加記憶體讀取范圍的限制來解決不安全的問題,在實際的應用中,也許使用提供的安全函式會更加合理,但是,在學習中,幾乎所有的課本以及教程都使用的原來的標準函式,另外考慮到移植性的問題,因此,我們通常仍然需要標準的庫函式來實作相關功能,
但是,如果在VS中使用原始的函式(我用的是vs2017),編譯器將會報錯,這對使用和學習都帶來了相當的不便,如果只使用VS撰寫代碼,那么還是使用函式scanf_s比較好,畢竟安全可靠,而且使用難度也沒大很多,
如果之后想使代碼通用有如下方法:
- 第一種
在代碼開頭寫上如下代碼
#define _CRT_SECURE_NO_WARNINGS
- 第二種
右擊我們創建的專案,點擊屬性,然后C/C++→前處理器定義后面打個; 之后黏貼上 _CRT_SECURE_NO_WARNINGS點擊ok即可,此方法適用于整個專案,在該專案中,將不再需要添加相關宏定義,但是其他專案自然不受該設定的影響,因此,如有需要,在其他專案中需要再次進行相同的配置才能生效,


- 第三種
找到選單欄的專案,找到專案的屬性,找到C/C++,找到代碼生成,在代碼生成中有個安全檢查,將啟用安全檢查修改為禁用安全檢查,這個方法也行,

- 第四種方法
進入vs的安裝目錄,找到一個newc++file.cpp檔案在里面加入 _CRT_SECURE_NO_WARNINGS之后保存也行,大概目錄就是,
你設定的安裝目錄\Common7\IDE\VC\vcprojectitems
可以用記事本編輯,但要以管理員身份打開;搜索記事本之后以管理員身份打開,編輯,保存即可,

也可以使用notepad++直接打開編輯保存即可,今天我下載的最新版本才3M多,很小,大家可以下了留的之后編輯其他代碼,再之后你創建的所有專案開始就會有這一句話,你在這句話下邊再正常撰寫你的代碼就可以了,之后就不會再出現錯誤了,
notepad++官網下載地址https://notepad-plus.en.softonic.com/
好了,學習總結到此結束,歡迎留言交流,記得點贊鼓勵哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274895.html
標籤:其他
