c語言scanf和scanf s的區別,詳解

時間 2021-09-11 22:33:34

1樓:帽子狗

scanf是標準庫函式

scanf_s 是vs的庫函式 微軟認為c標準的scanf_s不安全 自己做的

比如給字串寫值的時候必須確認 陣列大小 防止訪問越界char d[20];

scanf("%s",d);

scanf_s("%s",d,20);

2樓:大野瘦子

1、使用區別

scanf()不會檢查輸入邊界,可能造成資料溢位。

scanf_s()會進行邊界檢查。

2、意思

scanf表示從鍵盤輸入指定格式的資料。如:scanf("%d",x);指從鍵盤給x輸入一個int型(整型)資料;scanf("%f",x);指從鍵盤給x輸入一個float型(實型)資料;

對應的輸出為:printf 按照指定的格式輸出資料;如printf("%d",x); 指按整型資料輸出x中的值。

因為帶「_s」字尾的函式是為了讓原版函式更安全,傳入一個和引數有關的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統。

3、scanf_s()引數與scanf()不同

例如scanf(「%s」,&name,n),整形n為name型別的大小,如果name是陣列,那n就是該陣列的大小。

3樓:匿名使用者

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]要放'\0'

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

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

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

4樓:匿名使用者

scanf這個是標準輸入輸出裡面的函式哦,它是標準c(ansi c標準)定義的介面函式,window,linux/unix,mac都提供這個介面函式,但是scanf_s這個東西,嘿嘿,萬惡的微軟,***,你用了你就綁死在window上了

也許scanf真的不安全,但是和可移植性相比呢?而且,scanf_s這個東西安全?

5樓:難得當歌對酒時

二者的區別與 strcpy 和 strncpy 的區別一樣scanf_s提供更安全一些的機制 ,以防止溢位 ,對於 %s , %s 等 ,變數地址後要緊跟一個引數,以表示其大小,如:

wchar_t ws[10];

scanf_s("%s", ws, 10);

6樓:匿名使用者

ansi c中沒有scanf_s(),只有scanf(),scanf()在讀取時不檢查邊界,所以可能會造成內在洩露。所以vc++2005/2008中提供了scanf_s(),在呼叫時,必須提供一個數字以表明最多讀取多少位字元。

c語言中 scanf("%*s"); 的具體意思, 5

7樓:匿名使用者

scanf是c語言中的一個輸入函式,與printf函式一樣,都被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上#include 。(在有一些實現中,printf函式與scanf函式在使用時可以不使用預編譯命令#include 。

)它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf函式返回成功讀入的資料項數,讀入資料時遇到了「檔案結束」則返回eof。

8樓:吉祥二進位制

int n;

scanf("%*d %*d %d",&n);

printf("%d",n);

return 0;

如果輸入的是1 2 3,那麼輸出的是3,因為前兩個已經忽略啦。

9樓:匿名使用者

scanf("%*s"); 這個是輸入是跳過 一個*

也就是當你輸入一個* 這個星號會跳過而不獲取。

c語言、為什麼只執行一個scanf_s函式

10樓:匿名使用者

scanf_s不是這樣用的,你要寫成下面這種(後面的40是指最多要輸入多少個字元)

scanf_s("%s", fname,40);

scanf_s("%s", lname,40);

fflush(stdin);

另外scanf_s遇到空格也會以為是新的輸入,所以如果你的某項內容中如果有空格,要寫成類似這種

scanf_s("%[^\n]", fname,40);

fflush(stdin);

scanf_s("%[^\n]", lname,40);

fflush(stdin);

c語言scanf問題

這個說的結束,意思就是這一個資料的結束。而不是一個錄入的結束。比如你輸入 19 2021 22 之後回車,電腦會讀入19,然後有空格,記錄完成,繼續讀下一個資料20 之後以此類推 不知道你想問什麼問題,並不衝突。首先scanf可以在一個語句中輸入多個資料,比如scanf s s 這時候讀取資料就按那...

關於C語言中scanf和printf函式

輸入結果要看你 定義的變數 year 和 code 的 型別,決定,1,int year char code scanf d c year,code printf d c year,code 列印結果 1998和逗號 c 只能接受耽擱字元你輸入的是1998,r 所以 code 裡面鋤從了逗號 而沒有...

c語言scanf無法輸入值,關於C語言中用scanf函式如何輸入資料的問題

樂跑小子 scanf 是c語言標準庫中的輸入函式,宣告包含在stdio.h檔案中,因此要使用該函式,必須載入 include標頭檔案。當執行到scanf函式時,程式就暫停等待使用者輸入,該函式只接受變數的地址,格式為 變數名。是一個阻塞式的函式,等使用者輸入完畢後,則將值賦值給變數,至此函式呼叫完畢...