天天看點

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)

{

 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