LPTSTR,CString互轉及字串類操作說明

2021-08-21 14:05:42 字數 4529 閱讀 5773

---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 ...