C运行库中的安全字符串处理函数(即函数名以_s结尾的函数)

C运行库中的安全字符串处理函数

通常,修改字符串的函数都存在一个安全隐患,即目标字符串的缓冲不够大,则会导致内存中的数据被破坏。

例如:

WCHAR szbuffer[3]=L"";

wcscpy(szbuffer,L"abc");

以上的例子是以0结尾的,需要szbuffer[4]才可以容纳。但编译时并不会有任何报错或警告。

 

针对以上问题,我们必须使用“安全字符串处理函数”,这一类的函数以_s结尾(secure之意),我们来看一下这类函数的原型.

PTSTR _tcscpy(PTSTR strDestination,PCTSTR strSource);

errno_t _tcscpy_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);

 

PTSTR _tcscat(PTSTR strDestination,PCTSTR strSource);

errno_t  _tcscat_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);

 

可以看到,在将一个缓冲区作为目标缓冲区时,必须提供这个缓冲区的大小(可容纳的字符个数),通过调用_countof宏计算出来。

这个缓冲区大小参数的主要任务就是验证缓冲区是否足以容纳结果数据.

现在,我们调用这些安全函数的时候,就可以检查返回的errno_t值。只有返回S_OK值,才表明函数调用成功。其他的值可以参照errno.h中的定义。

 

来看一个例子:

TCHAR szbuffer[3]=L"";

_tcscpy_s(szbuffer,_countof(szbuffer),_T("abc"));

执行完后, szbuffer的第一个字符被设置为'/0',而其他所有字节全部被设置为0xfd(填充符)。

注释:

如果数组szbuffer的空间大小不够容纳字符串_T("abc")时,函数_tcscpy_s数组szbuffer的处理策略是

保持数组szbuffer里原来的内容不变,对数组szbuffer里未被使用的空间都设置为0xfd(填充符)

 参考:

windows编程中字符和字符串的处理


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值