編者:李國帥
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);//tcdect的0——7位置被設置 //wcout << tcDect << endl; //_tcscpy(tcDect,L"");//僅僅第一個元素(16bit)設置爲0 //_tcscat_s(tcDect,10,tcSource);//僅僅把tcSource中0位置結束前的0——7位置字符添加到tcDect尾部 //wcout << tcDect << endl; //_tcscpy(tcDect,L"");//僅僅第一個元素(16bit)設置爲0 //_tcsncat_s(tcDect,10,tcSource,7);//僅僅把tcSource中0結束符前的7字符添加到tcDect尾部,同時追加0結束符 //wcout << tcDect << endl;
//_tcscpy(tcDect,L"");//僅僅第一個元素(16bit)設置爲0 //_tcscpy(tcDect,tcSource);//僅僅把tcSource中0位置結束前的0——7位置字符拷貝給tcDect.8、9位置未被設置 //wcout << tcDect << endl; //_tcscpy(tcSource,tcDect); //wcout << tcSource << endl;
//_tcscpy_s(tcDect,10,tcSource);//僅僅把tcSource中0位置結束前的0——7位置字符拷貝給tcDect.8、9位置未被設置 //wcout << tcDect << endl; //_tcscpy(tcDect,L"");//僅僅第一個元素(16bit)設置爲0 //_tcscpy_s(tcDect,8,tcSource);//僅僅把tcSource中0位置結束前的0——7位置字符拷貝給tcDect.8、9位置未被設置 //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);//把tcSource的8個元素,拷貝到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);//把tcSource的6個元素,拷貝到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);//把tcSource的6個元素,拷貝到tcDect裏,其中含有7個位置。自動加入0結束符 _tcsncpy_s(tcDect, 10, tcSource, 9);//把tcSource的8個元素,拷貝到tcDect裏,因爲tcSource[7]=0,所以之後的字符被捨棄 //_tcsncpy(tcDect,tcSource,9);//把tcSource的9個元素,拷貝到tcDect裏,其中含有9個位置。tcSource[8]未知,必須爲可讀 wcout << tcDect << endl;
system("PAUSE"); return 0; } |