MFC中字符间相互转换总结
char szPath[50];
CString str;
str.Format("%s",szPath);
2、char*轉int
int nrOfBoards = 0;
char buffer[256];
nrOfBoards = atoi(buffer);
3、CSring轉string
string s(CString.GetBuffer());
CString str = "sdfg";
string s = (LPCTSTR)str;
5、string轉char*
char* p =string.c_str();
6、string轉CString //string先轉char*,后Char*轉CString
CString.format("%s",string.c_str());
7、WCHAR*轉int?
WCHAR Speck_num[5];int Max_Speckle_num = _wtoi(Speckle_num);?
m_Frame =Max_Speckle_num;
8、char*轉int
?int Max_Speckle_num = 0;
?char Speck_num[5];
Max_Speckle_num = atoi(Speckle_num);
轉自:網絡
一.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、_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;
????????int?i=100;
????????_variant_t?lVal(l);
????????lVal=(long)i;
4.COleVariant與_variant_t的使用方法基本一樣,示例如下:
????COleVariant?v3="字符串",v4=(long)1999;
????CString?str=(BSTR)v3.pbstrVal;
????long?l=v4.lVal;
八.其他
1.對消息的處理中,我們通常需要將WPARAM或LPARAM等32位數據(DWORD)分解成兩個16位數據(WORD),例如:
????LPARAM?lParam;
????WORD?loValue=LOWORD(lParam);?//取低16位
????WORD?hiValue=HIWORD(lParam);?//取高16位
2.對于16位的數據(WORD),我們可以使用同樣的方法分解成高低兩個8位的數據(BYTE),例如:
????WORD?wValue;??
????BYTE?loValue=LOBYTE(wValue);?//取低8位
????BYTE?hiValue=HIBYTE(wValue);?//取高8位
3.如何將CString類型的變量賦給char*類型的變量
(1)CString::GetBuffer函數
????char*?p;
????CString?str="hello";
????p=str.GetBuffer(str.GetLength());
????str.ReleaseBuffer();
(2)strcpy函數
????CString?str("aaaaaaaa");
????strcpy(str.GetBuffer(10),"aa");?????//string->char
????str.ReleaseBuffer();
????GetBuffer(int?n)函數用于獲取字符數組,其中n表示字符數組的長度,使用完該字符數組之后一定要調用ReleaseBuffer()函數來釋放這個字符數組。
????注:在能夠使用const?char*的地方,通常不要使用char*
(3)memcpy函數
????CString?mCS=_T("cxl");
????char?mch[20];
????memcpy(mch,mCS,20);
(4)LPCTSTR強制類型轉換(不建議使用)
????char*?ch;
????CString?str;
????ch=(LPSTR)(LPCTSTR)str;
????str="good!";
????sprintf(ch,"%s",(LPTSTR)(LPCTSTR)str);
(5)CString->LPTSTR->char*
????CString?Msg;
????Msg=Msg+"abc";
????LPTSTR?lpsz;
????lpsz=new?TCHAR[Msg.GetLength()+1];
????_tcscpy(lpsz,Msg);
????char*?psz;
????strcpy(psz,lpsz);
4.如何將CString類型的變量賦給const?char*類型的變量
????char*?a[100];
????CString?str("abcdef");
????strncpy(a,(LPCTSTR)str,sizeof(a));
????或
????strncpy(a,str,sizeof(a));
????注:編譯器會自動將CString類型的變量轉換為const?char*類型
5.如何將CString類型的變量賦給LPCTSTR類型的變量
????CString?cStr;
????const?char*?lpctStr=(LPCTSTR)cStr;????//允許將非常量地址賦給指向常量的指針
//不允許將常量地址賦給非常量指針
6.如何將LPCTSTR類型的變量賦給CString類型的變量
(LPCTSTR=?CString=?const?char*)
????LPCTSTR?lpctStr;
????CString?cStr=lpctStr;
7.如何將char*類型的變量賦給CString類型的變量
(1)直接賦值:CString?myString="This?is?a?test";
(2)構造函數:CString?s1("Tom");
8.如何將CString類型的變量賦給char[](字符串)類型的變量
(1)sprintf函數:
????CString?str="good!";
????char?temp[200];
????sprintf(temp,"%s",(LPCSTR)str);
????注:強制類型轉換(LPCSTR)str與(LPTSTR)(LPCTSTR)str等同,使用的區別僅在于CString對象是變量還是常量。
LPCTSTR表示const?char*,它得到的字符串是不可寫的!如果將其強制轉換位LPTSTR(去掉const),是極為危險的!要得到char*,應該使用GetBuffer或GetBufferSetLength函數,用完之后再調用ReleaseBuffer函數。
(LPCSTR)str=(LPTSTR)(LPCTSTR)str
(2)strcpy函數
????CString?str;
????char?c[256];
????strcpy(c,str);
????str="Hello";
????strcpy((char*)&c,(LPCTSTR)str);
九.關于CString的使用
1.指定CString形參
(1)對于大多數需要字符串參數的函數,最好將函數原型中的形參指定為一個指向字符(LPCTSTR),而非CString的const指針。當將形參指定為指向字符的const指針時,可將指針傳遞到TCHAR數組(如字符串["hihere"]或傳遞到CString對象)。CString對象將自動轉換成LPCTSTR。任何能夠使用LPCTSTR的地方也能夠使用CString對象。
(2)如果某個形參將不會被修改,則也將該參數指定為常量字符串引用(const?CString&)。如果函數要修改該字符串,則刪除const修飾符。如果需要默認為空值,則將其初始化為空字符串([""]),如下所示:
????void?AddCustomer(const?CString&?name,const?CString&?address,const?CString&?comment="");
(3)對于大多數函數的結果,按值返回CString對象即可。
2.串的基本運算
????char?s1[20]="dir/bin/appl",s2[20]="file.asm",s3[30],*p;
????int?result;
(1)求串長
????int?strlen(char*?s);???????????????//求串s的長度
????例:printf("%d",strlen(s1));
(2)串復制
????char*?strcpy(char*?to,char*?from);??//將from串復制到to串中,并返回to開始處的指針
????例:strcpy(s3,s1);
(3)串聯接
????char*?strcat(char*?to,char*?from);???//將from串復制到to串的末尾
????例:strcat(s3,"/");
???????????strcat(s3,s2);
(4)串比較
????int?strcmp(char*?s1,char*?s2);??????//比較s1和s2的大小,s1<s2(小于0)、s1=s2(0)和s1>s2(大于0)
????例:result=strcmp("baker","Baker");?//大于0
???????????result=strcmp("12","12");????????????//等于0
???????????result=strcmp("Joe","joseph");????//小于0
(5)字符定位
????char*?strchr(char*?s,char?c);????//找c在字符串s中第一次出現的位置。若找到,則返回該位置;否則NULL。
????例:p=strchr(s2,'.');?//p指向"file"之后的位置
(6)注意
A:上述操作是最基本的,其中后4個操作還有變種形式:strncpy、strncath和strnchr。
B:其他的串操作見C的<string.h>頭文件。在不同的高級語言中,對串運算的種類及符號都不盡相同。
C:其余的串操作一般可由這些基本操作組合而成。
????例:求子串的操作可如下實現
????//s和sub是字符數組,用sub返回串s的第pos個字符長度為len的子串
????void?substr(char*?sub,char*?s,int?pos,int?len)
????{
????????//其中0<=pos<=strlen(s)-1,且數組sub至少可容納len+1個字符
????????if(pos<0?||?pos>strlen(s)-1?||len<0)
????????????Error("parameter?error!");
?????????//從s[pos]起復制至多len個字符到sub
?????????strncpy(sub,*s[pos],len);
????}
總結
以上是生活随笔為你收集整理的MFC中字符间相互转换总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习Caffe实战笔记(19)Win
- 下一篇: BitBlt和StretchBlt的区别