1. 程式人生 > >VC各種字串轉換

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()

確實比data()要好.
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_atoi64atol.

將數字轉換為CString變數,可以使用CStringFormat函式。如

1CString s;
int i = 64;
s.Format("%d", i)

Format函式的功能很強,值得你研究一下。

2void 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);
}

CStringchar*互轉

1char * -> CString
CString strtest;
char * charpoint;
charpoint="give string a value";
strtest=charpoint;

2CString -> char *
charpoint=strtest.GetBuffer(strtest.GetLength());
標準C裡沒有string,char *==char []==string

可以用CString.Format("%s",char *)這個方法來將char *轉成CString

要把CString轉成char *,用操作符(LPCSTRCString就可以了。

CString-> char[100]
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));

CString型別的轉換成int

1CString型別的轉換成int,可以使用atoi_atoi64atol
例:CString aaa = "16" ;
    int int_chage = atoi((lpcstr)aaa) ;

2將數字轉換為CString變數,可以使用CStringFormat函式。

例: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,還有FormatVsprintf和不需要藉助於Afxitoa

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

方法一:使用SysAllocStringAPI函式。例如:
 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);

ANSIUnicode和寬字元之間的轉換
方法一:使用MultiByteToWideCharANSI字元轉換成Unicode字元,

使用WideCharToMultiByteUnicode字元轉換成ANSI字元。
方法二:使用“_T”ANSI轉換成一般型別字串,使用“L”ANSI轉換成Unicode

在託管C++環境中還可使用SANSI字串轉換成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表示要開闢一定大小的緩衝。SourceTypeDestinationType可以是A、 TWOLE,其含義分別是ANSIUnicode一般型別和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

BSTRLPSTRLPWSTR

Visual C++.NET的所有程式設計方式中,我們常常要用到這樣的一些基本字串型別,如BSTRLPSTRLPWSTR等。之所以出現類似上述的這些資料型別,是因為不同程式語言之間的資料交換以及對ANSIUnicode和多位元組字符集(MBCS)的支援。

那麼什麼是BSTRLPSTR以及LPWSTR呢?

1BSTR(Basic STRingBasic字串)是一個OLECHAR*型別的Unicode字串。它被描述成一個與自動化相相容的型別。由於作業系統提供相應的API函式(SysAllocString)來管理它以及一些預設的排程程式碼,因此BSTR實際上就是一個COM字串,但它卻在自動化技術以外的多種場合下得到廣泛使用。

2LPSTRLPWSTRWin32VC++所使用的一種字串資料型別。LPSTR被定義成是一個指向以NULL(‘\0’)結尾的8ANSI字元陣列指標,而LPWSTR是一個指向以NULL結尾的16位雙位元組字元陣列指標。在VC++中,還有類似的字串型別,如LPTSTRLPCTSTR等。

例如,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

CStringCStringA 和 CStringW

Visual C++.NET中將CStringT作為ATLMFC的共享的一般字串類,它有CStringCStringACStringW三種形式,分別操作不同字元型別的字串。這些字元型別是TCHARcharwchar_tTCHARUnicode平臺中等同於WCHAR(16Unicode字元),在ANSI中等價於charwchar_t通常定義為unsigned short。由於CStringMFC應用程式中經常用到,這裡不再重複。

三、VARIANTCOleVariant _variant_t

OLEActiveXCOM中,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型別。例如,如果vtVT_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是一個用於COMVARIANT類,它的功能與COleVariant相似。不過在Visual C++.NETMFC應用程式中使用時需要在程式碼檔案前面新增下列兩句:

  #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的封裝,它的構造和解構函式分別呼叫SysAllocStringSysFreeString函式,其他操作是借用BSTR API函式。與_variant_t相似,使用時也要新增comutil.hcomsupp.lib

BSTRchar*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

方法一.使用SysAllocStringAPI函式。例如:

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) ANSIUnicode和寬字元之間的轉換

方法一.使用MultiByteToWideCharANSI字元轉換成Unicode字元,使用WideCharToMultiByteUnicode字元轉換成ANSI字元。

方法二.使用“_T”ANSI轉換成一般型別字串,使用“L”ANSI轉換成Unicode,而在託管C++環境中還可使用SANSI字串轉換成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表示要開闢一定大小的緩衝。SourceTypeDestinationType可以是A、 TWOLE,其含義分別是ANSIUnicode一般型別和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);

三.CStringBSTRLPTSTR之間的區別

定義

1CString:動態的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.LPWSTRLPCWSTR由此產生,它們的含義類似於LPSTRLPCSTR,不同的是字元資料wchar_t16位,而char卻為8位。

TCHAR資料型別

TCHAR資料型別是為了實現ANSIUnicode兩種編碼的通用而提出來的

1.如果定義了_UNICODE,則宣告如下:

    typedef wchar_t TCHAR;

2.如果沒有定義_UNICODE,則宣告如下:

    typedef char TCHAR;

這樣就可以讓CStringLPTSTRLPCTSTR中的每個字元都是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來轉換

Astr.Format("%d",i); //短整型int->CString

Bstr.Format("%f",f); //浮點數float->CString

(2)支援CString建構函式的資料型別可以直接賦值,例如char*

    str=username;

BSTR_bstr_tCCombBSTR

BSTR:指向字串的32位指標,_bstr_tCComBSTR都是對它的封裝。

1.char*->BSTR的轉換

    BSTR b=_com_util::ConvertStringToBSTR("資料");

    注:使用之前需要加上comutil.h標頭檔案

2.BSTR->char*的轉換

    char* p=_com_util::ConvertBSTRToString(b);

VARIANT_variant_tCOleVariant

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_EMPTYvt與常用資料型別的對應關係(略)。

3.variant_tVARIANT的封裝類,賦值可以使用強制型別轉換,其建構函式會自動處理這些資料型別。

例如: long l=222;