vs2017使用函式Scanf報錯解決方法

2021-09-11 15:47:05 字數 1469 閱讀 9826

在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 這個容易出現問題 最先加進去的專案,預設是使用預編譯頭的 在後來新增的專案中,該...