回覆列表
  • 1 # 使用者9951423351433

    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利用原版的不安全性(漏洞)黑掉系統。

  • 中秋節和大豐收的關聯?
  • 老婆待產前,老公必須要做的事情有哪些?