对_tcscpy,_tcsncpy_s,_tcscat系列函数进行复制字节,尾部处理的测试例程

编者:李国帅

qq:9611153 微信lgs9611153

时间:2010-2-27

背景原因:

在VC编码过程中,_tcscpy,_tcsncpy_s,_tcscat系列函数很容易出现错误,容易出现内存溢出,字符截断,字符乱码等很多问题。

编写这个测试例子,主要用来测试_tcscpy,_tcsncpy_s,_tcscat系列函数在进行字符串赋值的时候,都是复制了那些字节,结尾如何处理。

 

编程体会:

为了安全,一定要保证逻辑上的容错性和正确性,另外,使用熟悉的成熟函数,不熟悉的函数尽量回避。

 

例程:

 

int _tmain(int argc, _TCHAR* argv[])

{

         TCHAR tcSource[8];//_tcslen(tcSource) = 7

         TCHAR tcDect[10];

         //_tcscpy(tcSource,L"12345678");//未出现异常,但是不含结束符0

         //wcout << tcSource << endl;

         _tcscpy(tcSource, L"1234567");//正确,包含结束符0

         wcout << tcSource << endl;

 

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcscat(tcDect,tcSource);//tcdect0——7位置被设置

         //wcout << tcDect << endl;

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcscat_s(tcDect,10,tcSource);//仅仅把tcSource0位置结束前的0——7位置字符添加到tcDect尾部

         //wcout << tcDect << endl;

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncat_s(tcDect,10,tcSource,7);//仅仅把tcSource0结束符前的7字符添加到tcDect尾部,同时追加0结束符

         //wcout << tcDect << endl;

 

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcscpy(tcDect,tcSource);//仅仅把tcSource0位置结束前的0——7位置字符拷贝给tcDect.89位置未被设置

         //wcout << tcDect << endl;

         //_tcscpy(tcSource,tcDect);

         //wcout << tcSource << endl;

 

         //_tcscpy_s(tcDect,10,tcSource);//仅仅把tcSource0位置结束前的0——7位置字符拷贝给tcDect.89位置未被设置

         //wcout << tcDect << endl;

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcscpy_s(tcDect,8,tcSource);//仅仅把tcSource0位置结束前的0——7位置字符拷贝给tcDect.89位置未被设置

         //wcout << tcDect << endl;

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcscpy_s(tcDect,7,tcSource);//异常,目的缓冲区太小-----------重要

         //wcout << tcDect << endl;

 

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncpy(tcDect,tcSource,7);//仅仅拷贝7个位置,结束符0没有被拷贝进去,所以tcDect可能被有结束符

         //wcout << tcDect << endl;

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncpy(tcDect,tcSource,8);//0位置也拷贝进去大小_tcslen(tcSource)+1

         //wcout << tcDect << endl;

         //_tcsncpy(tcDect,tcSource,10);//把未知的数据拷贝到tcDect,因为tcSource[8]不存在。

         //wcout << tcDect << endl;

 

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncpy_s(tcDect,10,tcSource,8);//tcSource8个元素,拷贝到tcDect里,其中含有10个位置。

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncpy_s(tcDect,7,tcSource,8);异常,目的缓冲区太小

         //wcout << tcDect << endl;

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncpy_s(tcDect,7,tcSource,6);//tcSource6个元素,拷贝到tcDect里,其中含有7个位置。自动加入0结束符

         //wcout << tcDect << endl;

 

         //int sizeCopy = 7;//必须是字符的个数,不包含结束符。小于tcSource中的数组大小8

         //int sizeDect = 10;//必须大于sizeCopy,小于等于tcDect中数组大小10.

         //_tcscpy(tcDect,L"");//仅仅第一个元素(16bit)设置为0

         //_tcsncpy(tcDect,tcSource,7);//仅仅拷贝7个位置,结束符0没有被拷贝进去,所以tcDect可能被有结束符

         //wcout << tcDect << endl;

         _tcscpy(tcDect, L"");//仅仅第一个元素(16bit)设置为0

         _tcsncpy_s(tcDect, 10, tcSource, 7);//tcSource6个元素,拷贝到tcDect里,其中含有7个位置。自动加入0结束符

         _tcsncpy_s(tcDect, 10, tcSource, 9);//tcSource8个元素,拷贝到tcDect里,因为tcSource[7]=0,所以之后的字符被舍弃

         //_tcsncpy(tcDect,tcSource,9);//tcSource9个元素,拷贝到tcDect里,其中含有9个位置。tcSource[8]未知,必须为可读

         wcout << tcDect << endl;

 

         system("PAUSE");

         return 0;

}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值