VC各種字串轉換
轉自:網路
一.CString,int,string,char*之間的轉換
string 轉 CString
CString.Format("%s", string.c_str());
char 轉 CString
CString.Format("%s", char*);
char 轉 string
string s(char *);
string 轉 char *
char *p = string.c_str();
CString 轉 string
string s(CString.GetBuffer());
1.string -> CString
CString. Format("%s", string.c_str());
用c_str()
2.char -> string
string s(char *);
你的只能初始化,在不是初始化的地方最好還是用assign().
3.CString -> string
string s(CString.GetBuffer());
GetBuffer()後一定要ReleaseBuffer(),否則就沒有釋放緩衝區所佔的空間.
《C++標準函式庫》中:
有三個函式可以將字串的內容轉換為字元陣列和C—string
1.data(),返回沒有”\0“的字串陣列
2.c_str(),返回有”\0“的字串陣列
3.copy()
CString 和 int互轉
將字元轉換為整數,可以使用atoi、_atoi64或atol.
將數字轉換為CString變數,可以使用CString的Format函式。如
(1)CString s;
int i = 64;
s.Format("%d", i)
Format函式的功能很強,值得你研究一下。
(2)void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString ss="1212.12";
int temp=atoi(ss); //字元轉換為整數
CString aa;
aa.Format("%d",temp); //整數轉換為字元
AfxMessageBox("var is " + aa);
}
CString和char*互轉
(1)char * -> CString
CString strtest;
char * charpoint;
charpoint="give string a value";
strtest=charpoint;
(2)CString -> char *
charpoint=strtest.GetBuffer(strtest.GetLength());
標準C裡沒有string,char *==char []==string
可以用CString.Format("%s",char *)這個方法來將char *轉成CString。
要把CString轉成char *,用操作符(LPCSTR)CString就可以了。
CString-> char[100]
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
CString型別的轉換成int
(1)CString型別的轉換成int,可以使用atoi、_atoi64或atol。
例:CString aaa = "16" ;
int int_chage = atoi((lpcstr)aaa) ;
(2)將數字轉換為CString變數,可以使用CString的Format函式。
例:CString s;
int i = 64;
s.Format("%d", i)
CString ss="1212.12";
int temp=atoi(ss);
CString aa;
aa.Format("%d",temp);
如果是使用char陣列,也可以使用sprintf函式。
數字->字串除了用CString::Format,還有FormatV、sprintf和不需要藉助於Afx的itoa
string->char*
string aa("aaa");
char *c=aa.c_str();
注:1.string.c_str()只能轉換成const char *:const char *c=aa.c_str();
2.cannot convert from 'const char *' to 'char *'
3.要轉成char *這樣寫:
string mngName;
char t[200];
memset(t,0,200);
strcpy(t,mngName.c_str());
BSTR轉換成char*
方法一:使用ConvertBSTRToString。例如:
#include #pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[])
{
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完釋放
delete[] lpszText2;
return 0;
}
方法二:使用_bstr_t的賦值運算子過載。例如:
_bstr_t b = bstrText;
char* lpszText2 = b;
char*轉換成BSTR
方法一:使用SysAllocString等API函式。例如:
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
方法二:使用COleVariant或_variant_t。例如:
COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
方法三,使用_bstr_t,這是一種最簡單的方法。例如:
BSTR bstrText = _bstr_t("This is a test");
方法四,使用CComBSTR。例如:
BSTR bstrText = CComBSTR("This is a test");
或CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
方法五,使用ConvertStringToBSTR。例如:
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
CString轉換成BSTR
通常是通過使用CStringT::AllocSysString來實現。例如:
CString str("This is a test");
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); // 用完釋放
BSTR轉換成CString
一般可按下列方法進行:
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;
或CStringA str(bstrText);
ANSI、Unicode和寬字元之間的轉換
方法一:使用MultiByteToWideChar將ANSI字元轉換成Unicode字元,
使用WideCharToMultiByte將Unicode字元轉換成ANSI字元。
方法二:使用“_T”將ANSI轉換成“一般”型別字串,使用“L”將ANSI轉換成Unicode
在託管C++環境中還可使用S將ANSI字串轉換成String*物件。
例如:TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
方法三:使用ATL 7.0的轉換巨集和類。
ATL7.0在原有3.0基礎上完善和增加了許多字串轉換巨集以及提供相應的類:
其中,第一個C表示“類”,以便於ATL 3.0巨集相區別,第二個C表示常量,2表示“to”,EX表示要開闢一定大小的緩衝。SourceType和DestinationType可以是A、 T、W和OLE,其含義分別是ANSI、Unicode、“一般”型別和OLE字串。
例如:CA2CT就是將ANSI轉換成一般型別的字串常量。下面是一些示例程式碼:
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);
二.VC字串轉換(BSTR CString)
一.BSTR、LPSTR和LPWSTR
在Visual C++.NET的所有程式設計方式中,我們常常要用到這樣的一些基本字串型別,如BSTR、LPSTR和LPWSTR等。之所以出現類似上述的這些資料型別,是因為不同程式語言之間的資料交換以及對ANSI、Unicode和多位元組字符集(MBCS)的支援。
那麼什麼是BSTR、LPSTR以及LPWSTR呢?
1.BSTR(Basic STRing,Basic字串)是一個OLECHAR*型別的Unicode字串。它被描述成一個與自動化相相容的型別。由於作業系統提供相應的API函式(如SysAllocString)來管理它以及一些預設的排程程式碼,因此BSTR實際上就是一個COM字串,但它卻在自動化技術以外的多種場合下得到廣泛使用。
2.LPSTR和LPWSTR是Win32和VC++所使用的一種字串資料型別。LPSTR被定義成是一個指向以NULL(‘\0’)結尾的8位ANSI字元陣列指標,而LPWSTR是一個指向以NULL結尾的16位雙位元組字元陣列指標。在VC++中,還有類似的字串型別,如LPTSTR、LPCTSTR等。
例如,LPCTSTR是指“long pointer to a constant generic string”,表示“一個指向一般字串常量的長指標型別”,與C/C++的const char*相對映,而LPTSTR對映為 char*。
一般地,還有下列型別定義:
#ifdef UNICODE
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
二.CString、CStringA 和 CStringW
Visual C++.NET中將CStringT作為ATL和MFC的共享的“一般”字串類,它有CString、CStringA和CStringW三種形式,分別操作不同字元型別的字串。這些字元型別是TCHAR、char和wchar_t。TCHAR在Unicode平臺中等同於WCHAR(16位Unicode字元),在ANSI中等價於char。wchar_t通常定義為unsigned short。由於CString在MFC應用程式中經常用到,這裡不再重複。
三、VARIANT、COleVariant 和_variant_t
在OLE、ActiveX和COM中,VARIANT資料型別提供了一種非常有效的機制,由於它既包含了資料本身,也包含了資料的型別,因而它可以實現各種不同的自動化資料的傳輸。下面讓我們來看看OAIDL.H檔案中VARIANT定義的一個簡化版:
struct tagVARIANT {
VARTYPE vt;
union {
short iVal; // VT_I2.
long lVal; // VT_I4.
float fltVal; // VT_R4.
double dblVal; // VT_R8.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR.
…
short * piVal; // VT_BYREF|VT_I2.
long * plVal; // VT_BYREF|VT_I4.
float * pfltVal; // VT_BYREF|VT_R4.
double * pdblVal; // VT_BYREF|VT_R8.
DATE * pdate; // VT_BYREF|VT_DATE.
BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
};
};
顯然,VARIANT型別是一個C結構,它包含了一個型別成員vt、一些保留位元組以及一個大的union型別。例如,如果vt為VT_I2,那麼我們可以從iVal中讀出VARIANT的值。同樣,當給一個VARIANT變數賦值時,也要先指明其型別。例如:
VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long資料型別
va.lVal = a; // 賦值
為了方便處理VARIANT型別的變數,Windows還提供了這樣一些非常有用的函式:
VariantInit —— 將變數初始化為VT_EMPTY;
VariantClear —— 消除並初始化VARIANT;
VariantChangeType —— 改變VARIANT的型別;
VariantCopy —— 釋放與目標VARIANT相連的記憶體並複製源VARIANT。
COleVariant類是對VARIANT結構的封裝。它的建構函式具有極為強大大的功能,當物件構造時首先呼叫VariantInit進行初始化,然後根據引數中的標準型別呼叫相應的建構函式,並使用VariantCopy進行轉換賦值操作,當VARIANT物件不在有效範圍時,它的解構函式就會被自動呼叫,由於解構函式呼叫了VariantClear,因而相應的記憶體就會被自動清除。除此之外,COleVariant的賦值操作符在與VARIANT型別轉換中為我們提供極大的方便。例如下面的程式碼:
COleVariant v1("This is a test"); // 直接構造
COleVariant v2 = "This is a test";
// 結果是VT_BSTR型別,值為"This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// 結果是VT_I4型別,值為2002
_variant_t是一個用於COM的VARIANT類,它的功能與COleVariant相似。不過在Visual C++.NET的MFC應用程式中使用時需要在程式碼檔案前面新增下列兩句:
#include "comutil.h"
#pragma comment( lib, "comsupp.lib" )
四.CComBSTR和_bstr_t
CComBSTR是對BSTR資料型別封裝的一個ATL類,它的操作比較方便。例如:
CComBSTR bstr1;
bstr1 = "Bye"; // 直接賦值
OLECHAR* str = OLESTR("ta ta"); // 長度為5的寬字元
CComBSTR bstr2(wcslen(str)) ; // 定義長度為5
wcscpy(bstr2.m_str, str); // 將寬字串複製到BSTR中
CComBSTR bstr3(5, OLESTR("Hello World"));
CComBSTR bstr4(5, "Hello World");
CComBSTR bstr5(OLESTR("Hey there"));
CComBSTR bstr6("Hey there");
CComBSTR bstr7(bstr6); // 構造時複製,內容為"Hey there"
_bstr_t是是C++對BSTR的封裝,它的構造和解構函式分別呼叫SysAllocString和SysFreeString函式,其他操作是借用BSTR API函式。與_variant_t相似,使用時也要新增comutil.h和comsupp.lib。
五.BSTR、char*和CString轉換
(1) char*轉換成CString
若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如:
char chArray[] = "This is a test";
char * p = "This is a test";
或:LPSTR p = "This is a test";
或在已定義Unicode應的用程式中:TCHAR * p = _T("This is a test");
或:LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
(2) CString轉換成char*
若將CString類轉換成char*(LPSTR)型別,常常使用下列三種方法:
方法一.使用強制轉換。例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二.使用strcpy。例如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個引數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。
方法三.使用CString::GetBuffer。例如:
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer(); // 在這裡新增使用p的程式碼
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer(); // 使用完後及時釋放,以便能使用其它的CString成員函式
(3) BSTR轉換成char*
方法一.使用ConvertBSTRToString。例如:
#include
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[])
{
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完釋放
delete[] lpszText2;
return 0;
}
方法二.使用_bstr_t的賦值運算子過載。例如:
_bstr_t b = bstrText;
char* lpszText2 = b;
(4) char*轉換成BSTR
方法一.使用SysAllocString等API函式。例如:
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
方法二.使用COleVariant或_variant_t。例如:
//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
方法三.使用_bstr_t,這是一種最簡單的方法。例如:
BSTR bstrText = _bstr_t("This is a test");
方法四.使用CComBSTR。例如:
BSTR bstrText = CComBSTR("This is a test");
或CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
方法五.使用ConvertStringToBSTR。例如:
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
(5) CString轉換成BSTR
通常是通過使用CStringT::AllocSysString來實現。例如:
CString str("This is a test");
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); // 用完釋放
(6) BSTR轉換成CString
一般可按下列方法進行:
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;
或CStringA str(bstrText);
(7) ANSI、Unicode和寬字元之間的轉換
方法一.使用MultiByteToWideChar將ANSI字元轉換成Unicode字元,使用WideCharToMultiByte將Unicode字元轉換成ANSI字元。
方法二.使用“_T”將ANSI轉換成“一般”型別字串,使用“L”將ANSI轉換成Unicode,而在託管C++環境中還可使用S將ANSI字串轉換成String*物件。例如:
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
方法三:使用ATL 7.0的轉換巨集和類。ATL7.0在原有3.0基礎上完善和增加了許多字串轉換巨集以及提供相應的類:
其中,第一個C表示“類”,以便於ATL 3.0巨集相區別,第二個C表示常量,2表示“to”,EX表示要開闢一定大小的緩衝。SourceType和DestinationType可以是A、 T、W和OLE,其含義分別是ANSI、Unicode、“一般”型別和OLE字串。
例如:CA2CT就是將ANSI轉換成一般型別的字串常量。下面是一些示例程式碼:
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);
三.CString,BSTR和LPTSTR之間的區別
一.定義
1、CString:動態的TCHAR陣列。它是一個完全獨立的類,封裝了+等操作符和字串操作方法。
2.BSTR:專有格式的字串(需要使用系統函式來操縱)。
定義為:typedef OLECHAR FAR* BSTR
3.LPCTSTR:常量的TCHAR指標。定義為:typedef const char* LPCTSTR
二.要點
1.char*:指向ANSI字元陣列的指標,其中每個字元佔8位(有效資料是除掉最高位的其他七位),它保持了與傳統C/C++的相容。
2.LPSTR:指向一個以“\0”結尾的ANSI字元陣列的指標,可與char*互換使用,它通常在Win32中使用。其中LP表示長指標(long pointer)。
3.LPCSTR:該資料型別的特性在於它的例項不能被使用它的API函式改變,除此之外與LPSTR等同。其中C表示常量(CONSTANT)。
4.在Win16下長指標(LP)和短指標(P)有區別,而在Win32下它們是沒有區別的,都是32位。
5.TCHAR在採用Unicode方式下編譯時為wchar_t,在普通編碼方式下編譯時位char。
三.Unicode標準
1.為了滿足程式程式碼國際化的需要,業界推出了Unicode標準,它提供了一種簡單和一致的表示字串的方法,所有字元中的位元組都是16位(兩個位元組)的值,其數量也可以滿足幾乎世界上所有書面語言字元的編碼需求,開發程式時使用Unicode(型別wchar_t)是一種被鼓勵的做法。
2.LPWSTR和LPCWSTR由此產生,它們的含義類似於LPSTR和LPCSTR,不同的是字元資料wchar_t為16位,而char卻為8位。
四.TCHAR資料型別
TCHAR資料型別是為了實現ANSI和Unicode兩種編碼的通用而提出來的
1.如果定義了_UNICODE,則宣告如下:
typedef wchar_t TCHAR;
2.如果沒有定義_UNICODE,則宣告如下:
typedef char TCHAR;
這樣就可以讓CString、LPTSTR和LPCTSTR中的每個字元都是TCHAR型別,而不考慮它們的編碼格式。而且CString是一個封裝好了的類,更是大大地方便了使用者的使用。
五、VC++中常用資料型別之間的轉換
1.定義
int i=100;
long l=2001;
float f=300.2;
double d=12345.119
char username[]="2008北京奧運";
char temp[200];
char* buf;
CString str;
_variant_t v1;
_bstr_t v2;
2.其他資料型別到字串的轉換
(1)短整形int->字串
itoa(i,temp,10); //按十進位制把i轉換為字串存入temp中
itoa(i,temp,2); //按二進位制把i轉換為字串存入temp中
(2)長整形long->字串
ltoa(l,temp,10);
3.從其他包含了字串的變數中獲取指向該字串的指標
(1)從CString變數中獲取字串
str="祈福四川";
buf=(LPSTR)(LPCTSTR)str;
(2)從BSTR型別的_varitant_t變數中獲取字串
v1=(_bstr_t)"程式設計師";
buf=_com_util::ConvertBSTRToString((_bstr_t)v1);
4.字串轉換為其他資料型別
strcpy(temp,"123");
(1)i=atoi(temp); //字串->短整型int
(2)l=atol(temp); //字串->長整形long
(3)d=atof(temp); //字串->浮點型double
5.其他資料型別轉換到CString
(1)使用CString的成員函式Format來轉換
A:str.Format("%d",i); //短整型int->CString
B:str.Format("%f",f); //浮點數float->CString
(2)支援CString建構函式的資料型別可以直接賦值,例如char*
str=username;
六.BSTR、_bstr_t和CCombBSTR
BSTR:指向字串的32位指標,_bstr_t和CComBSTR都是對它的封裝。
1.char*->BSTR的轉換
BSTR b=_com_util::ConvertStringToBSTR("資料");
注:使用之前需要加上comutil.h標頭檔案
2.BSTR->char*的轉換
char* p=_com_util::ConvertBSTRToString(b);
七.VARIANT、_variant_t和COleVariant
1.對於VARIANT變數的賦值:首先給vt成員賦值,指明資料型別。再對聯合結構中相同資料型別的變數賦值(可參考VC98\Inlude\OAIDL.H標頭檔案中關於tagVARIANT結構體的定義)。舉例如下:
VARIANT va;
va.vt=VT_l4; //指明資料型別
va.lVal=2008;
2.對於不馬上賦值的VARIANT,最好先使用void VariantInit(VARIANTARG FAR* pvarg)函式對其進行初始化,其本質是將vt設定為VT_EMPTY。vt與常用資料型別的對應關係(略)。
3.variant_t是VARIANT的封裝類,賦值可以使用強制型別轉換,其建構函式會自動處理這些資料型別。
例如: long l=222;