scanf s 比起 scanf 新增了什麼?

時間 2021-05-30 03:04:37

1樓:暮無井見鈴

scanf_s 幾乎沒有比 scanf 更加安全,除了空指標的檢測。而且 scanf 本身也能做邊界檢查的。

char

buffer

[128

];scanf

("%127s"

,buffer

);// 安全

scanf_s

("%127s"

,buffer

,128

);// 安全

scanf

("%s"

,buffer

);// 不安全

scanf_s

("%s"

,buffer

,128

);//

安全,當輸入過長時能呼叫報錯函式

說實話,若最後一條的 128 被寫成過大的數也不安全。

個人看來 _s 系列最大的功能就是呼叫報錯函式,可能可以簡化一些報錯的流程。

(set_constraint_handler_s, constraint_handler_t)

有點懷疑 _s 系列的用法是——

別人傳來乙個莫名其妙的指標/長度/輸入內容,然後你直接就把它傳到 _s 系列函式裡去,不過之前要寫對邊界。

接下來等著乙個統一的報錯流程就行了。

另外 qsort_s 和 bsearch_s 有個 context 引數,疑是讓人把 C++ 的函式物件傳進去的…

就像這樣:

extern

"C"int

c_style_cmpr

(const

void

*lhs

,const

void

*rhs

,void

*p_functor

)// 上面的東西或許會在 C 中被譯成同義內容

// ...

qsort_s

(array

,num_sort

,sizeof

(data_t

),c_style_cmpr,&

functor

);……純 C 的話不知有沒有這種習慣,C++ 裡這麼做怎麼看都很詭異就是。

2樓:新生命

加乙個引數就是規定字串最大長度。是更安全的函式。c11新標準

但是我很討厭微軟預設開安全檢查使得scanf報4996錯誤。

不需要vs這麼貼心。應該把黑鍋讓程式設計師背(逃

c語言 用scanf s混合輸入int,float,char型變數怎麼會報錯

好問題。首先是太長不看環節。我在這裡給出正確寫法,以便題主直接複製貼上 scanf s a d,b d,c1 c,c2 c,x f,y f,z f a,b c1,1,c2 1,x,y z 如果題主對原理不感興趣,可以跳過這一行之後的所有內容,直接關閉網頁 應用。這是因為scanf s函式對字元和字串...

c 中cin和scanf的區別是什麼?

cin是iostream類的乙個物件,符號是過載,讀入的是 流 再將流強制轉換成你所要的資料型別。具體可看c primer中io類一章了解。scanf是函式,c的遺產,不太了解。不過函式和物件是很明顯兩個概念。建議用cin和cout。 冒泡 具體實現的方法的問題,你輸入的整數在你的平台上已經超過un...

如果scanf的格式指示符是 f,賦給乙個double型的變數,在記憶體層面上會發生什麼?

這個問題比較有趣。我們先貼一段 scanf 對於浮點處理的原始碼 來自scanf.c,minix核心原始碼 引用自cnblogs ifndef NOFLOAT long double ld val endif 預設將所有浮點型用 Lf 來儲存,可以保證所有精度。ifndef NOFLOAT case...