scanf_s()函數是Microsoft公司VS開發工具提供的一個功能與scanf()相同的安全標准輸入函數。在調用該函數讀取字符數組時,必須提供一個數字以表明最多讀取多少位字符。
原因和區別:
scanf()在讀取數據時不檢查邊界,所以可能會造成內存訪問越界:
char a[5]; scanf("%s", a); //如果輸入123456789,則5以后的部分會被寫到別的變量所在的空間上去,從而可能會導程序運行異常。
以上代碼如果用scanf_s()則可避免此問題:
char a[5]; scanf_s("%s",a,5); //最多讀取4個字符,因為a[4]要放'\0' //如果輸入超出容量了,數組將得不到任何東西。
注:scanf_s最后一個參數n是接收緩沖區的大小(即數組的容量)。
PS: 很多帶“_s”后綴的函數是為了讓原版函數更安全,傳入一個和參數有關的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統。