1. 程式人生 > >strcpy、wcscpy與_tcscpy關係 strcpy_s與strcpy比較

strcpy、wcscpy與_tcscpy關係 strcpy_s與strcpy比較

C++標準庫函式提供了字元和字串的操作函式,並提供了其UNICODE版本,如:
char *strcpy(char *strDestination, const char *strSource);  
wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource); 
wcscpy()即為strcpy()的寬字元版本,與_T類似的,Visual C++提供了類似的同名函式:
#ifdef  UNICODE   
    #define _tcscpy     wcscpy  
#else  
    #define _tcscpy     strcpy  
#endif 
 
_tcscpy 
在編譯時會根據條件被替換, 
如果是 非UNICODE 工程,它就被替換為 strcpy 
UNICODE 工程被替換為 wcscpy 

下是使用strcpy_s與strcpy的安全性比較
char szBuf[2] = {0};
strcpy_s(szBuf, 2, "12131"); //新的CRT函式
strcpy(szBuf, "12131");    //老的CRT函式
上述程式碼,明顯有緩衝區溢位的問題。 使用strcpy_s函式則會丟擲一個異常。而使用strcpy函式的結果則未定,因為它錯誤地改變了程式中其他部分的記憶體的資料,可能不會丟擲異常但導致程式資料錯誤,也可能由於非法記憶體訪問丟擲異常。
使用新的增強安全的CRT函式有什麼好處呢?簡單地說,新的函式加強了對引數合法性的檢查以及緩衝區邊界的檢查,如果發現錯誤,會返回errno或丟擲異常。老版本的這些CRT函式則沒有那麼嚴格的檢查與校驗,如果錯誤地傳輸了引數或者緩衝區溢位,那麼錯誤並不能被立刻發現,對於定位程式錯誤也帶來更大困難。