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...