scanf 和 scanf_s

來源:互聯網
上載者:User

標籤:

  scanf 和 scanf_s

 

  • scanf()函數是標準C中提供的標準輸入函數,用以使用者輸入資料
  • scanf_s()函數是Microsoft公司Visual Studio開發工具提供的一個與scanf()功能相同的安全標準輸入函數

  從vc++2005開始,VS系統提供了scanf_s()。在調用該函數時,必須提供一個數字以表明最多讀取多少位字元。

 

 

  原因和區別

 

  scanf()在讀取資料時不檢查邊界,所以可能會造成記憶體訪問越界:
  例如:分配了5位元組的空間但是使用者輸入了10位元組,就會導致scanf()讀到10個位元組

    char buf[5]={‘\0‘};    scanf("%s", buf);

  如果輸入1234567890,則5以後的部分會被寫到別的變數所在的空間上去,從而可能會導致程式運行異常。


  以上代碼如果用scanf_s()則可避免此問題:

    char buf[5]={‘\0‘};    scanf_s("%s",buf,5); //最多讀取4個字元,因為buf[4]要放‘\0‘ 

  如果輸入1234567890,則buf只會接受前4個字元

  註: scanf_s最後一個參數n是接收緩衝區的大小(即buf的容量),表示最多讀取n-1個字元.


  PS: 很多帶“_s”尾碼的函數是為了讓原版函數更安全,傳入一個和參數有關的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統。

 

 

  圓周率Pi

 

  tan(Pi/4)=1 => Pi=4*arctan(1)    

  反正切函數arctan()在C語言裡表示為atan(),為保證精度取圓周率的代碼如下(謹記):

 

    const double Pi = 4.0 * atan(1.0);

 

scanf 和 scanf_s

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.