scanf()函式是標準C中提供的標準輸入函式,用以使用者輸入資料
scanf_s()函式是Microsoft公司VS開發工具提供的一個功能相同的安全標準輸入函式,從vc++2005開始,VS系統提供了scanf_s()。在呼叫該函式時,必須提供一個數字以表明最多讀取多少位字元。
原因和區別:
scanf()在讀取資料時不檢查邊界,所以可能會造成記憶體訪問越界:
//例如:分配了5位元組的空間但是使用者輸入了10位元組,就會導致scanf()讀到10個位元組
char buf[5]={""};
scanf("%s", buf);
//如果輸入1234567890,則5以後的部分會被寫到別的變數所在的空間上去,從而可能會導致程式執行異常。
以上程式碼如果用scanf_s()則可避免此問題:
scanf_s("%s",buf,5); //最多讀取4個字元,因為buf[4]要放""
//如果輸入1234567890,則buf只會接受前4個字元
注: scanf_s最後一個引數n是接收緩衝區的大小(即buf的容量),表示最多讀取n-1個字元.
PS: 很多帶“_s”字尾的函式是為了讓原版函式更安全,傳入一個和引數有關的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統。
scanf()函式是標準C中提供的標準輸入函式,用以使用者輸入資料
scanf_s()函式是Microsoft公司VS開發工具提供的一個功能相同的安全標準輸入函式,從vc++2005開始,VS系統提供了scanf_s()。在呼叫該函式時,必須提供一個數字以表明最多讀取多少位字元。
原因和區別:
scanf()在讀取資料時不檢查邊界,所以可能會造成記憶體訪問越界:
//例如:分配了5位元組的空間但是使用者輸入了10位元組,就會導致scanf()讀到10個位元組
char buf[5]={""};
scanf("%s", buf);
//如果輸入1234567890,則5以後的部分會被寫到別的變數所在的空間上去,從而可能會導致程式執行異常。
以上程式碼如果用scanf_s()則可避免此問題:
char buf[5]={""};
scanf_s("%s",buf,5); //最多讀取4個字元,因為buf[4]要放""
//如果輸入1234567890,則buf只會接受前4個字元
注: scanf_s最後一個引數n是接收緩衝區的大小(即buf的容量),表示最多讀取n-1個字元.
PS: 很多帶“_s”字尾的函式是為了讓原版函式更安全,傳入一個和引數有關的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統。