關於VS2017使用scanf報錯的問題(圖文)

在用VS2017編譯一個程序時,如果你在程序中使用了C語言的輸入函數scanf,會發現這樣的警告:


大致意思是說scanf這個函數不安全,讓程序員考慮使用scanf_s,並給出了一種停用這個警告的方式。

下面給出三種解決方法

方法一:在代碼的最頂行寫入#define _CRT_SECURE_NO_WARNINGS可以讓之後使用scanf時不出現警告。

方法二:修改文件屬性也可以做到和方法①一樣的效果,具體操作如下:

在右側選中文件,右鍵屬性:


依次選中:C/C++ >> 預處理器,在右側預處理器定義右側添加上:_CRT_SECURE_NO_DEPRECATE


確定。

方法三:使用scanf_s

scanf在讀取數據時不檢查邊界,可能會造成內存訪問越界的問題,使用scanf_s,會多一個參數來控制讀取的字符數量,這樣確實比使用scanf輸入更加安全。

下面舉一個很簡單的例子:

定義char s1[5]; 輸入時故意超出s1的範圍,比較兩種輸入的處理方式:

①用scanf輸入:


輸入123456789


出錯!

②用scanf_s輸入:



同樣輸入123456789,因爲scanf_s函數中的最後一個參數限制了讀取個數,所以這次輸入並不計入,自然也不會出現錯誤。

特別注意:在此例中,輸入的字符數超過5個(包括5個)都會導致程序出錯或是不計入,因爲字符數組最後一個s1[4]默認爲字符串的結束標誌‘\0’。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章