1. 程式人生 > 其它 >C 語言簡單的認識 scanf_s

C 語言簡單的認識 scanf_s

#include <stdio.h>

int main(void)
{
    char a[20];

    printf("請輸入一個字串:");
    scanf_s("%s", a, 20);
    printf("您輸入的是:%s\n", a);

    return 0;
}

輸出:

請輸入一個字串:abcdefg
您輸入的是:abcdefg

很多帶“_s”字尾的函式是為了讓原版函式更安全,傳入一個和引數有關的大小值,避免引用到不存在的元素。
比如:char d[20];寫成scanf_s("%s",d,20);才是正確的,有這個引數20使準確性提高。

ANSI C中沒有scanf_s(),只有scanf(),scanf()在讀取時不檢查邊界,所以可能會造成記憶體訪問越界,例如分配了5位元組的空間但是讀入了10位元組

  1. char buf[5]={'\0'};
  2. scanf("%s", buf);如果輸入1234567890,後面的部分會被寫到別的空間上去。以上程式碼如果用scanf_s,第二行應改為scanf_s("%s",buf,5),表示最多讀取5-1個字元,因為buf[4]要放'\0'

scanf_s最後一個引數是緩衝區的大小,表示最多讀取n-1個字元.

vc++2005/2008中提供了scanf_s(),在最新的VS2019中也提供了scanf_s()。在呼叫時,必須提供一個數字以表明最多讀取多少位字元。

  1. 讀取單個字元也需要限定長度:scanf_s("%c,%c",&c1,1,&c2,1);而不能寫成scanf_s("%c,%c",&c1, &c2,1, 1);否則編譯器會報錯



參考:
百度百科:https://baike.baidu.com/item/scanf_s/443572?fr=aladdin