以字符拷贝函数为例:
分为TCHAR版 MCBS 和UNICODE版
TCHAR | MCBS | UNICODE | VC推荐安全版 |
_tcscpy | strcpy | wcscpy | *_s |
_tcsncpy | strncpy | wcsncpy | *_s |
从src拷贝字符到des,于是就产生了2个问题:
它们2个串的长度和相互匹配问题。
原来的strcpy是复制src中的字符到des,包括空值结束符,但是怕des太小,容不下,容易崩溃,所以有了后来的strncpy,指定了拷贝的长度,但终归目的是要求des长度要合适。即便如此,事情往往并没有像预料那般前进,不可避免会有des长度不合适,导致程序运行时崩溃。所以有了_s版,有错的话,会弾出错误信息来纠正,而不是直接崩溃,这样就好多了。而且在des长度足够时,使用strncpy_s比strncpy要好,_s版会自动把拷贝后des剩余部分清零,strncpy不会这样做,你得手动清零,不然有可能des值是str+乱码。不过_s版不是标准库里的函数,各有取舍。
这里主要记录下VC推荐安全版的区别,因为VC的编译器推荐使用它们的_s版。
有不多参数的,也有加参数的。
前者不加参数时(&des)[size]类型,只能用于静态分配内存的指针,
后者多了一个参数在*des后面,des可以是动态分配内存的指针,
目的是保证缓冲区的大小。
而实际操作中会碰到各种情况。只需要明白它们之间的区别,合理使用。