对_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;

}

 

 

 

你可能感兴趣的:(C/C++)