strcpy,strncpy和strncpy_s的區別

首先說下strcpy
strcpy()是依據源串的\0作爲結束判斷的,不檢查copy先的Buffer的Size,如果目標空間不夠,就有BufferOverflow問題。

strncpy的原型爲:
char * strncpy(char *dest, char *src, size_t n);
其將字符串src中最多n個字符複製到字符數組dest中(它並不像strcpy一樣遇到NULL才停止複製,而是等湊夠n個字符纔開始複製),返回指向dest的指針,所以,用戶定義好size,就沒有bufferoverfolow的風險

目前,strncpy是字符串拷貝推薦的用法!!!!

加_s版本則是從VS2005開始推出的安全版本,
而加_s版本之所以安全,是因爲他們在接口增加了一個參數numElems來表明dest中的字節數,防止目標指針dest中的空間不夠而導致出現Bug,同時返回值改成返回錯誤代碼,而不是爲了一些所謂的方便而返回char*。這樣接口的定義就比原來安全很多。

但是,_s版本並不是標準庫,所以,不推薦使用!!
在VS2015程序編譯時,會彈出錯誤提示,推薦你使用_s版本函數替換:
error xxxxxx: ‘strncpy’: This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

解決方法:
右擊工程 - 屬性 - 配置屬性 - C/C++ - 命令行
命令行增加: /D _CRT_SECURE_NO_WARNINGS

發佈了102 篇原創文章 · 獲贊 82 · 訪問量 124萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章