在用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’。