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

}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章