mfc中CString如何轉化為const char 型別?

時間 2021-05-30 02:29:20

1樓:蔣晟

你這是想傳送乙個原始資料為UTF-16編碼的字串,但是send只接受位元組陣列(雖然引數型別是char*但是實際上是當作byte*來用的)。所以你要首先決定用什麼編碼(UTF-8、GB2312、Big5之類,具體選哪個編碼去問接收方)。決定之後用WideCharToMultiByte編碼再傳給send。

2樓:Cyandev

LPWSTR 就是 wchar_t 的指標,L 代表 Long,是乙個與 long 型長度相同的指標,wchar_t 可以理解為 unsigned short,乘放的是 UNICODE,如果你直接傳送指標所指的這段位元組,不要忘記用字串長度乘以 sizeof(wchar_t) 就好。

還有啊,你這個 I/O 操作放到 UI 執行緒來做,你是不是覺得你活在未來...

3樓:

初學者就好好啃書吧,或者去CSDN問問也比這強。基本功不紮實導致的問題,就算幫你解答乙個,也有千百個在後面等著。

知乎這個風氣也是夠夠的,實在忍不住補充點說明。

首先 CString 作為 MFC/ATL 標配的字串類,是可以方便轉換成字串指標來用的,但注意這裡有個小坑,就是某些答主提到的GetBuffer,不應該這麼用。

CString::GetBuffer 的作用,是鎖定字串緩衝區,得到乙個可安全修改的指標,用完之後必須 ReleaseBuffer。如果只想把CString強轉成const char *,考慮到你現在的編譯環境是Unicode編碼,分成幾種情況。

CString str("ABC");

1. // 這種方法轉出的指標,在 str 被修改前都是安全的,建議不要像這樣儲存指標,應即用即轉。

const

wchar_t*wp

=(LPCTSTR

)str

;const

char*p

=(LPCSTR)wp

;send

(socket,p

,6,0

);// 這樣用更合理

send

(socket,(

LPCSTR

)(LPCTSTR

)str,6

,0);由於當前編譯環境為 Unicode,CString 實際上是 CSringW,雖然強轉成了 const char *,但你實際發出去的字串是 "A\0B\0C\0"六個位元組。

2.你就是想發出 "ABC"三個位元組,那就必須用 API 把Unicode字串轉換成ANSI字串再傳送。

CString

str1

("ABC"

);// 定義乙個緩衝區來儲存轉換後的字串

CStringA

strA

;// 思考一下為什麼長度要 *2

DWORD

ansiLength

=str1

.GetLength()*

2;// 把 Unicode 字串轉換為 ANSI 字串,存入 StrA 中

WideCharToMultiByte

(CP_ACP,0

,(LPCWSTR

)str1,-

1,strA

.GetBuffer

(ansiLength

),ansiLength

,NULL

,NULL

);// GetBuffer 必須 Release,否則後續操作無法進行

strA

.ReleaseBuffer

();// 好了,現在可以安心傳送了

send

(socket,(

LPCSTR

)strA

,strA

.GetLength

(),0

);此時實際傳送的的就是 "ABC"三個位元組。

PS: 雖然這個問題很基礎,但其中涉及到記憶體布局、字符集、型別轉換等問題,展開了講一萬字也包不住。即使像某些答主所言轉成Qt,一樣會踩到同樣的坑,到時候恐怕來問的就是 QString 如何轉換成 const char * 的問題了。

所以,根本的解決問題還是好好啃書和搜尋,遇到不明白的名詞,就去搞清楚概念,這樣才能真正掌握相關技術,而不是一步一磕。

4樓:

LPTSTR text = (LPTSTR)str;

mfc裡用mfc的資料型別,別再直接用const char*了。這裡其實出來的是wchar* 。具體細節可以看下LPTSTR的巨集定義。

5樓:jgjutkdzggvuivrx

msdn.microsoft.com/zh-cn/library/ms235631(v=vs.140).aspx 善用msdn

6樓:風的回憶

上班的時候用手機碼字還是挺累的,但是看到問題就有點想答了,單單只用一句話就說了這麼多bug我也是挺佩服的。。。

然後推測你的意圖應該是CString轉const char*吧,.getbuffer()就可以得到TCHAR*,我覺得不如去用標準庫裡面的string的.c_str()或.

data()。

7樓:

c++ ?話說你為了打個全形的加號出來再切回去要至少多按4次鍵盤吧,

如果能排除掉複製貼上的可能性,只能說你要麼是個完全不上心的初學者,要麼就是再裝嫩賣傻.

不過這三種可能性都只是證明了一件事:你的態度極差.

8樓:叛逆者

1. cstring什麼鬼。C++的cstring是個頭檔案,沒什麼轉化不轉化的。2. constr char什麼鬼。const也能拼錯?

3. string怎麼著也是轉化成const char*,轉化成const char什麼鬼。string::c_str()能拿到const char*的。

4. 難道你說的MFC的CString?那用GetBuffer能拿到TCHAR*的。5. 人家那叫c++,不叫c++。全形半形還沒搞清?

甲烷如何轉化成乙烯?

望著木星的喵 將甲烷用等離子弧 電弧加熱到1500K,再急冷淬火就能獲得乙烷 乙烯 乙炔 氫氣 殘餘甲烷的混合物,乙烷可以再通過脫氫反應變成乙烯。 小水道平 目前來說,我所知道的最好的辦法是甲烷濕氣重整變成合成氣,利用合成氣去做MTO過程。大連化學物理研究所在這方面有極其突出的貢獻 悲觀的ye1lo...

如何把優勢轉化為勝勢?

9sss 不同層面,不同分段,該做的事情也不同。應該是要做到優勢擴大再擴大。好比如,對面上路是個鱷魚,自家是個銳雯,你是個打野或,成功gank對面鱷魚兩次,然後你就可以不理上路了。是無論如何都不要理上路,若銳雯在幫兩次的情況下還被鱷魚單殺,就更不用去幫他了,幫不動。這時候你可以觀察自己中下路的情況是...

如何把知識轉化為認知?

無心 借用聖人一句話 知行合一。借用領袖一句話 實踐是檢驗真理的唯一標準。借用我一句話 不能作用到生活實際,你的知識有毛用呀! 林覲心 這個問題其實你自己知道,但是你又以為自己不知道 冷了要添衣服,是不是乙個知識?但它同樣也是你的認知 內急要上廁所,是不是乙個知識?但它同樣也是你的認知 不要亂穿馬路...