在vs2017使用scanf函式時,出現如下錯誤:
error c4996: 'scanf': this function or variable may be unsafe. consider using scanf_s instead. to disable deprecation, use _crt_secure_no_warnings. see online help for details.
其原因是函式scanf是ansi c中的函式,其在讀取時不檢查邊界,所以可能造成記憶體訪問越界。例如分配了5個位元組的空間,但讀入了10個位元組:
如果輸入1234567890,則567890會被寫到別的空間上去,從而導致程式執行異常。
有時黑客可以利用函式scanf 的這個不安全性黑掉系統。為了防止這一問題,從vc++2005開始,微軟公司的vs提供了函式scanf_s。其功能與原版函式scanf 相同,不同的是,在呼叫函式scanf_s時,必須提供乙個數字以表明最多讀入多少位字元。上面第二行**使用scanf_s函式時,應如下書寫:
表示最多讀取4個字元,因為buf[4]要放'\0'。函式scanf_s的最後乙個引數n是緩衝區的大小,表示最多讀取n-1個字元。採用函式scanf_s讀取單個字元時,也需要限定長度,如下書寫:
函式scanf_s是微軟公司vs特有的函式。與scanf功能相同,只是前者更安全可靠。
其解決方法如下:
1.若只用vs編寫**,還是使用scanf_s函式比較好,比較安全可靠。
2.若編寫的**需要移植到其他ide上,函式scanf_s是vs特有,其他ide不認識會報錯,在vs仍希望使用scanf,可以如下:(ps:方法只需要選擇乙個使用即可,感覺哪個方便就用那個!)
一.在vs上程式設計時,第一行首先寫上 #define _crt_secure_no_warnings
二.在vs上程式設計時,第一行首先寫上 #pragma warning(disable:4996)
三.找到選單欄的專案→專案的屬性→c/c++→預處理器,右側有個預處理器定義,在其引數中加上括號中的** ( ; _crt_secure_no_warnings) 如下圖:
四.無需在程式最前面加那行**,只需在新建專案時取消勾選「sdl檢查」即可;若專案已建立好,在專案屬性裡關閉sdl檢測(選單欄的專案→專案的屬性→c/c++→**生成,在**生成中有個安全檢查,將啟用安全檢查修改為禁用安全檢查。)如下圖:
五.在專案屬性----c/c++ ----命令列中新增:/d _crt_secure_no_warnings就行了。如下圖:
問題就完美解決了!
總結 解決VS2017無法使用scanf的方法
1 在程式最前面加 define crt secure no deprecate 2 在程式最前面加 pragma warning disable 4996 3 把scanf改為scanf s 4 無需在程式最前面加那行 只需在新建專案時取消勾選 sdl檢查 即可 5 若專案已建立好,在專案屬性裡關...
VS2017中scanf函式報錯的解決方案
1 在程式最前面加 define crt secure no deprecate 2 在程式最前面加 pragma warning disable 4996 3 把scanf改為scanf s 4 無需在程式最前面加那行 只需在新建專案時取消勾選 sdl檢查 即可 5 若專案已建立好,在專案屬性裡關...
vs 2017 初次使用
1,參考vs2017官網,按照步驟操作,完全可以完成程式的編譯執行。2,作為初學者出現的問題 1 乙個工程裡不能出現多個main 函式,不然無法編譯 project 裡面會自動載入編譯 include stdafx.h 這個容易出現問題 最先加進去的專案,預設是使用預編譯頭的 在後來新增的專案中,該...