vs2010 CString轉換char *

百度了半天,大家的介紹很多,但是發現不全面,一直解決不了問題,綜合下自己的情況分享下自己的解決辦法。

 

首先網上最常見的轉換是這樣的:

CString  str("Test");

char *p=(LPSTR)(LPCTSTR)str;

或者

char *p=(char *)(LPCTSTR)str;

 

以上的方法不會報錯,但是忽略了一個問題,那就是你的編譯環境是怎樣的,如果你是UNICODE,那麼存儲字符串時是兩個字節兩個字節的,這樣強制轉換會出現亂碼的,特別是數字字符串的時候,直接就被截斷了,例如:“12345”, 通過上面的轉換後存入p裏面的值只有“1“,因爲內存裏面兩字節的1後兩位是0,就相當於字符串結束了。

以下是自己的解決辦法,希望對大家有用:

CString str;

#ifdef UNICODE
 wchar_t *lp = (LPTSTR)(LPCTSTR)str;  //如果是unicode編碼 要先轉換爲兩字節類型的字符串
 char cp[256];   //這兒簡單操作就不動態分配了
    int len= WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),NULL,0,NULL,NULL);   //寬字節變爲單字節
    WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),cp,len,NULL,NULL); 
    cp[len]='\0'; 
#else
 char *sp = (LPSTR)(LPCTSTR)str; //如果是單字節的可以直接這麼使用
#endif

 

 

以下對轉換的過程做一下封裝免得每次都要寫一大段代碼:

//CString轉換爲char * 注意CString已確定爲unicode編碼

char * CString2Char(CString str)
{
 wchar_t *temp = (LPTSTR)(LPCTSTR)str;//獲得的是CString的地址,不能修改指向的值
 return WChar2Char(temp);
}

 

//線程不安全 不能多線程調用
char * WChar2Char(wchar_t *str)
{
 /*因爲返回的內存要不停的申請與釋放,而且釋放很不方便,
 這兒用局部靜態變量,但由於長度限制爲10240字節,使用時
 要小心,當長度大於10240時要適當做擴展*/
 static char p[10240];//10k
 memset(p, 0, sizeof(char)*10240);//p會保留上次的結果,這兒最好初始化一下
 int len= WideCharToMultiByte(CP_ACP,0,str,wcslen(str),NULL,0,NULL,NULL);  
    if (len >= 10240)
  return NULL;
 WideCharToMultiByte(CP_ACP,0,str,wcslen(str),p,len,NULL,NULL); 
    p[len]='\0'; 
 return p;
}

 

這樣上面的代碼就可以簡化了,以後調用也方便多了

CString str;

char *p;

#ifdef UNICODE
   p = CString2Char(str);

#else
   p = (LPSTR)(LPCTSTR)str;
#endif

 

 

 

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