---lptstr 轉換成 cstring---
(1)直接賦值
cstring strtext;
lptstr lpsztext = _t("lptstr >> cstring");
strtext = lpsztext;
::messagebox( null, strtext , _t("標題"), mb_iconasterisk|mb_taskmodal|mb_ok );
(2)cstring::format()格式化
cstring strtext;
lptstr lpsztext = _t("lptstr >> cstring");
strtext.format( _t("%s"), lpsztext );
::messagebox( null, strtext , _t("標題"), mb_iconasterisk|mb_taskmodal|mb_ok );
cstring 轉換成 lptstr
(1)強制轉換
cstring strtext( _t("this is a test") );
lptstr lpsztext =(lptstr)(lpctstr)strtext;
::messagebox( null, lpsztext, _t("標題"), mb_iconasterisk|mb_taskmodal|mb_ok );
(2)使用lstrcpy()
cstring strtext( "this is a test" );
lptstr lpsztext = new tchar[strtext.getlength()+1];
lstrcpy( lpsztext, strtext );
::messagebox( null, lpsztext, _t("標題"), mb_iconasterisk|mb_taskmodal|mb_ok );
(3)使用cstring::getbuffer()
cstring strtext(_t("this is a test "));
lptstr lpsztext = strtext.getbuffer();
strtext.releasebuffer();
::messagebox( null, lpsztext, _t("標題"), mb_iconasterisk|mb_taskmodal|mb_ok );
---各字元型別說明---
cstring 和 lpctstr 可以說通用。 原因在於cstring定義的自動型別轉換,沒什麼奇特的,最簡單的c++操作符過載而已。
常量字串ansi和unicode的區分是由巨集_t來決定的。但是用_t( "abcd ")時, 字串 "abcd "就會根據編譯時的是否定一_unicode來決定是char* 還是 w_char*。 同樣,tchar 也是相同目的字元巨集。 看看定義就明白了。簡單起見,下面只介紹 ansi 的情況,unicode 可以類推。
ansi情況下,lpctstr 就是 const char*, 是常量字串(不能修改的)。
而lptstr 就是 char*, 即普通字串(非常量,可修改的)。
這兩種都是基本型別, 而cstring 是 c++類, 相容這兩種基本型別是最起碼的任務了。
由於const char* 最簡單(常量,不涉及記憶體變更,操作迅速), cstring 直接定義了乙個型別轉換函式
operator lpctstr() , 直接返回他所維護的字串。
當你需要乙個const char* 而傳入了cstring時, c++編譯器自動呼叫 cstring過載的操作符 lpctstr()來進行隱式的型別轉換。
當需要cstring , 而傳入了 const char* 時(其實 char* 也可以),c++編譯器則自動呼叫cstring的建構函式來構造臨時的 cstring物件。
因此cstring 和 lpctstr 基本可以通用。
但是 lptstr又不同了,他是 char*, 意味著你隨時可能修改裡面的資料,這就需要記憶體管理了(如字串變長,原來的存貯空間就不夠了,則需要重新調整分配記憶體)。
所以 不能隨便的將 const char* 強制轉換成 char* 使用。
如:lpstr lpstr = (lpstr)(lpctstr)string;
就是這種不安全的使用方法。
這個地方使用的是強制型別轉換,你都強制轉換了,c++編譯器當然不會拒絕你,但同時他也認為你確實知道自己要做的是什麼。因此是不會給出警告的。
強制的任意型別轉換是c(++)的一項強大之處,但也是一大弊端。這一問題在 vc6 以後的版本(僅針對vc而言)中得到逐步的改進(你需要更明確的型別轉換宣告)。
其實在很多地方都可以看到類似
lpstr lpstr = (lpstr)(lpctstr)string;
地用法,這種情況一般是函式的約束定義不夠完善的原因, 比如乙個函式接受乙個字串引數的輸入,裡面對該字串又沒有任何的修改,那麼該引數就應該定義成 const char*, 但是很多初學者弄不清const地用法,或者是懶, 總之就是隨意寫成了 char* 。 這樣子傳入cstring時就需要強制的轉換一下。
這種做法是不安全的,也是不被建議的用法,你必須完全明白、確認該字串沒有被修改。
cstring 轉換到 lptstr (char*), 預定的做法是呼叫cstring的getbuffer函式,使用完畢之後一般都要再呼叫releasebuffer函式來確認修改 (某些情況下也有不呼叫releasebuffer的,同樣你需要非常明確為什麼這麼做時才能這樣子處理,一般應用環境可以不考慮這種情況)。
同時需要注意的是, 在getbuffer 和 releasebuffer之間,cstring分配了記憶體交由你來處理,因此不能再呼叫其他的cstring函式。
lpstr、lpwstr、lpcstr、lpcwstr、lptstr、lpctstr的區分與轉化
首先在編譯程式時經常會遇到這種問題:
錯誤 1 error c2664: 「cwnd::messageboxw」: 不能將引數 1 從「const char [3]」轉換為「lpctstr」
1、覺得很煩,一般的做法就是不管三七二十一,在字串前面加乙個『l』:
如呼叫函式fun(lpctstr str)時,不能 fun("hello"); 而是fun(l"hello");
通常這樣做都比較能解決問題。
2、或者還可以用_t(), 即 fun(_t("hello")); _t() 的別名還有 _text(), text()。
稍微研究了下,bstr,lpstr,lpwstr,lpctstr,lptstr等這些讓人頭暈的東東。(還是c#裡簡單啊,直接tostring)
bstr:是乙個olechar*型別的unicode字串,是乙個com字串,帶長度字首,與vb有關,沒怎麼用到過。
lpstr:即 char *,指向以'/0'結尾的8位(單位元組)ansi字元陣列指標
lpwstr:即wchar_t *,指向'/0'結尾的16位(雙位元組)unicode字元陣列指標
lpcstr:即const char *
lpcwstr:即const wchar_t *
lptstr:lpstr、lpwstr兩者二選一,取決於是否巨集定義了unicode或ansi
lpctstr: lpcstr、lpcwstr兩者二選一,取決於是否巨集定義了unicode或ansi,如下是從mfc庫中拷來的:
#ifdef unicode
typedef lpwstr lptstr;
typedef lpcwstr lpctstr;
#else
typedef lpstr lptstr;
typedef lpcstr lpctstr;
#endif
3、相互轉換方法:
lpwstr->lptstr: w2t();
lptstr->lpwstr: t2w();
lpcwstr->lpcstr: w2ct();
lpcstr->lpcwstr: t2cw();
ansi->unicode: a2w();
unicode->ansi: w2a();
另外,cstring轉為cstringw方法(通過乙個wchar_t陣列來轉)
cstring str;
cstringw strw;
wchar_t *text = new wchar_t[sizeof(wchar_t) * str.getlength()];
multibytetowidechar(cp_acp,0,str,-1,text,str.getlength());
strw = text;
4、另外,還可以強行轉換,不過不一定能成功
5、還有_bstr_t ( 對btstr的封裝,需要#include),也可將單位元組字元陣列指標轉為雙位元組字元陣列指標,還沒怎麼沒用到過。
LPTSTR,CString互轉及字串類操作說明
lptstr 轉換成 cstring 1 直接賦值 cstring strtext lptstr lpsztext t lptstr cstring strtext lpsztext messagebox null,strtext t 標題 mb iconasterisk mb taskmodal ...
簡繁互轉 OpenCC簡體繁體互轉
昨天使用mysql自定義函式批量簡體繁體互轉,郭同學看見後給我建議使用opencc簡體繁體互轉,今天去研究了下如何使用。一 opencc是什麼 二 linux安裝opencc yum install y cmake yum install y git yum install y doxygen gi...
內錶 XML互轉 JSON 內錶互轉
轉進內錶 strans try.call transformation id source xml lv text out options clear all 4.7 沒有這個options value handling accept data loss 這個引數也沒有 result data p ...