VS2010 將CString轉換成char* 或const char*

VS2010 將CString轉換成char* 或const char*網上介紹了各種方法,令你眼花繚亂,
但很多方法其實在vs2010下是不湊效的,他們說的大部分方法都是在VC6.0下的轉換。而在VS2010的Unicode默認編程環境下,
經過試了N回之後還是不成功之後,會令你心煩意亂。下面是網上列舉的一些轉換的方法:CString轉char*,如:
char * a = (LPSTR)(LPCTSTR)name; //name類型爲CString
char * a =s name.GetBuffer(name.GetLength());
第一種方法在VS2010下他們不會報錯,你會發現你可能得不到預期的結果,具體原因不說,自己搜了,網上很多。
第二種方法會報錯如: error C2440: “=”: 無法從“wchar_t *”轉換爲“char *”;所以還是失敗了。
網上也沒有好的簡潔的方法,只有自己寫函數了,一個通用的比較好的函數,是既能將Cstring轉成char * 又能將其轉換爲const char *,
只需稍微修改即可

函數1:CString轉換爲char*

  1. char* CStrToChar(CString strSrc)  
  2. {  
  3. #ifdef UNICODE  
  4.         DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, NULL, 0, NULL, FALSE);  
  5.     char *psText;  
  6.     psText = new char[dwNum];  
  7.     if (!psText)  
  8.         delete []psText;  
  9.     WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, psText, dwNum, NULL, FALSE);  
  10.     return psText;  
  11. #else  
  12.     return (LPCTSRT)strSrc;  
  13. #endif  
  14. }  

轉換成const char * 的

  1. const char* CStrToChar1(CString strSrc)  
  2. {  
  3. #ifdef UNICODE  
  4.     DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, NULL, 0, NULL, FALSE);  
  5.     char *psText;  
  6.     psText = new char[dwNum];  
  7.     if (!psText)  
  8.         delete []psText;  
  9.     WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, psText, dwNum, NULL, FALSE);  
  10.     return (const char*)psText;  
  11. #else  
  12.     return (LPCTSRT)strSrc;  
  13. #endif  
  14. }  
都是比較通用的,在強制轉換不湊效的情況下,利用它們來轉換還是很很有效的!!只是存在一些缺點。
存在缺點:因爲返回的的是動態分配的數組,所以會有內存泄露的危險,
還需進一步改進!!!
可以直接作爲函數參數將CString變量進行直接轉換,但這樣就不能在使用完之後對其佔用的內存空間進行有效的釋放,
可以這樣使用:
  1. int main()  
  2. {  
  3.     CString str = _T("WINDOWS7");  
  4.     char* pChar1 = CStrToChar(str);  
  5.     //pChar = str.GetBuffer(str.GetLength());  // 不能這樣轉  
  6.     //char* pChar3 = (LPCSTR)(LPCTSTR)str;     // 取值時出現問題  
  7.     cout << "pChar1 = " << pChar1 << endl;  
  8.   
  9.     delete[] pChar1;  // 釋放由CStrTuChar函數佔用的內存  
  10.     return 0;  
  11. }  

但不能這樣用:

  1. CString GetLine(char* lpData, int &ndx);  
  2. int main()  
  3. {  
  4.     CString str = _T("WINDOWS7");  
  5.     GetLine(CStrToChar(str), 7); // 這樣做,由CStrCStrToChar分配的內存就無法釋放了,所以內存泄漏了  
  6.       
  7.     .........  
  8.     return 0;  
  9. }  
正確的用法就是先將轉換後的值賦給一個char *變量,在函數用完之後,釋放由char* 變量指向的內存。
函數2:CString轉換爲char
  1. int CStrToChar(char* pDest, CString&  pSource)  
  2. {  
  3.     size_t i;  
  4.     wchar_t* pawstr = NULL;  
  5.     pawstr =   pSource.GetBuffer(pSource.GetLength()+1);  // 先轉換爲寬字節  
  6.     //wcstombs(pDest, pawstr, pSource.GetLength()+1);     // 非安全版  
  7.     wcstombs_s(&i, pDest, pSource.GetLength()+1, pSource, pSource.GetLength()+1);  // 安全版  
  8.     return 0;  
  9. }  

下面是用法:

  1. #define BUFFER_SIZE 100  
  2. int main()  
  3. {  
  4.     CString str = _T("WINDOWS7");  
  5.     char ch[BUFFER_SIZE];  
  6.         char* pChar = ch;  
  7.     CStrToChar(pChar, str);  
  8.     cout <<"pChar =   "<< pChar << endl;  
  9.   
  10.     return 0;  
  11. }  

其實函數2更像是將CString變量轉換爲char變量,然後由char*變量指向char變量,所以,
缺點:指定字符數組大小BUFFER_SIZE,但其不用考慮內存泄露的問題,所以,
在CString變量不是很大的情況下,可以考慮。


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