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函式時,程式就暫停等待使用者輸入,該函式只接受變數的地址,格式為 變數名。是一個阻塞式的函式,等使用者輸入完畢後,則將值賦值給變數,至此函式呼叫完畢...