c語言-scanf問題 scanf和scanf_s的區別

scanf這個是復標准輸入輸出裡面的函制數哦,它是標准C(ANSI C標准)定義的介面函數,WINDOW,LINUX/UNIX,MAC都提供這個介面函數,但是scanf_s這個東西,嘿嘿,萬惡的微軟,你懂的,你用了你就綁死在WINDOW上了
也許scanf真的不安全,但是和可移植性相比呢?而且,scanf_s這個東西安全?

❷ C語言函數scanf_s能不能輸入多個字元串

void main(){
char s[10],ss[10];
scanf_s("%[^復,],%s",s,10,ss,10);
printf("%s %s",s,ss);
}
因為你制需要輸入逗號,所以對逗號應該特別處理.

❸ C語言,scanf("%*s")

表示你輸入錯了(不是數字)時把錯誤符號從輸入緩沖區里吸收掉,再由後面的兩行告訴你重新輸入……

❹ 為什麼c語言中char*s;scanf("%s",s)是錯的

出現錯誤的原因是s聲明的是一個char型指針,沒有指向一塊開辟出的地回址空間,系統隨機了答一個地址給s,對這個隨機的地址的空間進行賦值是非法的,所以出錯。

修改如下,先將s指向一塊開辟的地址空間之後再對其進行賦值。

char*s=(char*)malloc(100);//100為開辟空間大小
scanf("%s",s);

❺ C語言scanf與scanf_s

void scan改成這個
void scan(char **a)
{
scanf("%s",*a);
}
調用時用scan(&a);應該就可以了吧,這里的指針是局部值,用指針的指針來傳遞指針的值試試

❻ C語言中 scanf_s和 scanf 區別是什麼非常感謝

scanf()函數是標准C中提供的標准輸入函數,用以用戶輸入數據
scanf_s()函數是Microsoft公司VS開發工具提供的一個功能相同的安全標准輸入函數,從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利用原版的不安全性(漏洞)黑掉系統。

❼ C語言程序使用scanf_s輸入字元串按回車彈出警告

//scanf_s("%s%s",p,q);
scanf_s("%s",p);
scanf_s("%s",q);

拆成兩次來輸入吧。。自錯誤報的是訪問沖突,兩個指針都指向一起了,現在多核多線程,可能兩個同時在寫同一個內存。(試試看吧)

❽ C語言中 scanf_s和 scanf 區別是什麼

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就是該數組的大小。

❾ c語言scanf和scanf_s的區別,詳解

scanf是標准庫函數
scanf_s 是vs的庫函數 微軟認為c標準的scanf_s不安全 自己做的
比如給字內符串容寫值的時候必須確認 數組大小 防止訪問越界
char d[20];
scanf("%s",d);
scanf_s("%s",d,20);