標籤:

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


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++。全形半形還沒搞清?


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


一看就是入門就被vc6.0+mfc帶坑裡的。。。

少年,趕緊下個vs2015或者Qt吧,退vc保平安……


初學者就好好啃書吧,或者去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 *,但你實際發出去的字元串是 "ABC"六個位元組。

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 * 的問題了。

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


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

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


LPTSTR text = (LPTSTR)str;

mfc里用mfc的數據類型,別再直接用const char*了。這裡其實出來的是wchar* 。具體細節可以看下LPTSTR的宏定義。


百度能處理的這種層次的問題都來問?


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

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

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


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


都讓開!讓我來,最近老是搞這方面的。。

首先工程設置要為多位元組,這個不多解釋啦百度一下。

CSting有getbuff的介面,轉成空指針,強制轉換成char *賦值給string就可以啦!


我來告訴你一個簡單辦法吧,你去VS的項目設置里把使用Unicode字符集改成使用多位元組字符集,代碼就像截圖這麼寫,錯誤會神奇地消失。

記不太清是不是叫這個了,你可能得自己找下。


別用mfc了,看看qt吧,研究所這邊也全用qt了


CW2A


隨手幫你Google了一下

Convert CString to const char*


Cstring cstr=_T("hello world");

string str = CStringA(cstr);//CStringA是Ansi的CString

const char* con_c = str.c_str();

希望能幫到你


CT2CA(str).GetBuffer(0)


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

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


推薦閱讀:

#define 不是簡單的替換嗎,為什麼下面的代碼錯誤?
當把一個char類型轉換成int型的時候計算機里究竟而發生了什麼?
OpenMP在實際開發中應用多嗎?
對於 C/C++ 函數指針的困惑?
有沒有使用「==」判斷浮點數相等與否出現錯誤的例子?

TAG:編程 | CC |