1. 程式人生 > >strcpy,strncpy和strncpy_s的區別

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