CString是動態TCHAR數組,BSTR是專有格式字符串(需要通過系統提供的函數進行操作,LPCTSTR只是壹個常量TCHAR指針。
CString是壹個完全獨立的類,壹個動態的TCHAR數組,封裝了+等運算符和字符串操作方法。
typedef ol echar FAR * BSTR;
typedef const char * LPCTSTR
vc++中各種字符串的表示
首先,char*是壹個ANSI字符數組的指針,其中每個字符占用8位(有效數據是除最高位以外的其他7位),保持了與傳統C和C++的兼容性。
LP表示長指針。LPSTR是指向以' \ 0 '結尾的ANSI字符數組的指針,可以與char*互換使用,LPSTR在win32中廣泛使用。
LPCSTR中增加的' c '的含義是' CONSTANT ',表示該數據類型的實例不能用其API函數改變,它等同於LPSTR。
1.LP代表長指針。在win16下,長指針(LP)和短指針(P)是有區別的,但在win32下沒有區別,都是32位。所以這裏LP和P是等價的。
2.c代表常量
3.T是什麽?我們知道Tchar用Unicode編譯時是wchar_t,正常時間編譯成char。
為了滿足程序代碼國際化的需要,業界提出了Unicode標準,它提供了壹種簡單壹致的方式來表示字符串。字符中的所有字節都是16位,也可以滿足世界上幾乎所有書面語字符的編碼要求。在開發程序時,鼓勵使用Unicode(類型wchar_t)。
產生了LPWSTR和LPCWSTR,其含義與LPSTR和LPCSTR類似,只是字符數據是16位wchar_t而不是char。
然後,為了實現兩種編碼的通用性,TCHAR的定義被提出:
如果定義了_UNICODE,則聲明如下:
typedef wchar _ t TCHAR;
如果未定義_UNICODE,則聲明如下:
typedef char TCHAR;
LPTSTR和LPCTSTR中的意思是,每個字符都像這個TCHAR。
CString類中的字符聲明為TCHAR類型,提供了壹個打包的類,方便用戶使用。
LPCTSTR:
#ifdef _UNICODE
typedef const wchar _ t * LPCTSTR
#否則
typedef const char * LPCTSTR
#endif
使用轉換的VC通用數據類型的詳細說明
首先定義壹些常見的變量類型來說明。
int I = 100;
long l = 2001;
浮點f = 300.2
雙d = 12345.119;
Char用戶名[]= "夏成裴軍";
炭化溫度[200];
char * buf
CString字符串;
_ var _ t v 1;
_ bstr _ t v2
首先,其他數據類型被轉換成字符串
短整數(int)
itoa(i,temp,10);//將I轉換成字符串放入temp,最後壹個數字代表十進制。
itoa(i,temp,2);//以二進制模式轉換
長(長)
ltoa(l,temp,10);
其次,從包含該字符串的其他變量中獲取壹個指向該字符串的指針。
CString變量
Str = "2008北京奧運會";
buf =(LPSTR)(LPCTSTR)str;
BSTR類型的變量。
V1 = (_bstr_t)“程序員”;
buf = _ com _ util::ConvertBSTRToString((_ bstr _ t)v 1);
第三,字符串被轉換成其他數據類型
strcpy(temp," 123 ");
短整數(int)
I = atoi(temp);
長(長)
l = atol(溫度);
浮點(雙精度)
d = atof(溫度);
第四,其他數據類型被轉換為CString
使用CString的成員函數格式進行轉換,例如:
整數
海峽。格式(" %d ",I);
浮點數
海峽。格式(" %f ",I);
CString構造函數已經支持的數據類型,如字符串指針(char *)可以直接賦值。
str =用戶名;
動詞 (verb的縮寫)BSTR _ bstr _ t和CComBSTR
CComBSTR和_BSTR_t是BSTR的封裝,BSTR是指向字符串的32位指針。
Char *可以轉換成BSTR如下:BSTR b = _ com _ util::convertstringtobstr(" data ");//使用前需要添加頭文件comutil.h。
反之,可以使用char * p = _ com _ util::convertbstortstring(b);
6.變體,_variant_t和COleVariant
VARIANT的結構可以參考頭文件vc98 \ include \ oaidl.h中結構tagVARIANT的定義。
變量的賦值:先給vt成員賦值,表示數據類型,再給聯合結構中相同數據類型的變量賦值。例如:
變體va;
int a = 2001;
va.vt = VT _ I4//表示整數數據。
va . lval = a;//賦值
對於不立即賦值的Variant,最好先用Void Variant init(Variant arg far * pvarg);初始化的本質是將vt設置為VT_EMPTY。在下表中,我們列出了vt和公共數據之間的對應關系:
無符號字符bValVT_UI1
短iValVT_I2
長lValVT_I4
浮動浮動閥;佛蒙特州R4
double dblVal佛蒙特州R8
VARIANT _ BOOL boolVal布爾
斯考德斯考德;VT _錯誤
CY cyValVT_CY
日期日期;日期
BSTR·bstr val;佛蒙特州BSTR
IUnknown FAR * punkVal未知
IDispatch FAR * pdispVal調度
SAFEARRAY FAR * parrayVT_ARRAY|*
無符號char FAR * pbValVT_BYREF|VT_UI1
短遠軸;VT_BYREF|VT_I2
long FAR * plValVT_BYREF
float FAR * pfltValR4
double FAR * pdblValR8
VARIANT _ BOOL FAR * pboolValBYREF |布爾
SCODE FAR * pscodeVT_BYREF
CY FAR * pcyValBYREF
DATE FAR * pdate日期
BSTR FAR * pbstrVal;BSTR
IUnknown FAR * FAR * ppunkVal未知的
IDispatch FAR * FAR * ppdispValBYREF |調度
SAFEARRAY FAR * FAR * pparrayVT_ARRAY|*
變體FAR * pvarValBYREF|VT_VARIANT
void FAR * byrefBYREF
_VARIANT_t是VARIANT的封裝類,它的賦值可以使用強制類型轉換,它的構造函數會自動處理這些數據類型。
例如:
長l = 222
ing I = 100;
_ variant _ t lVal(l);
lVal =(long)I;
COleVariant的用法和_variant_t基本相同,請參考下面的例子:
COleVariant v3 = "string ",v4 =(long)1999;
CString str =(BSTR)v3 . pbstrval;
long i = v4.lVal
七。其他人
在報文處理過程中,我們經常需要將WPARAM或LPARAM等32位數據(DWORD)分解成兩個16位數據(WORD),例如:
LPARAM lParam
WORD loValue = LOWORD(lParam);//取低16位
WORD hi value = hi WORD(lParam);//取16位高。
對於16位數據(字),我們可以用同樣的方法將其分解成兩個8位數據(字節),例如:
WORD wValue
BYTE loValue = LOBYTE(wValue);//取低8位
BYTE hi value = hi BYTE(wValue);//取8個高位。
如何將CString類型的變量賦給char*類型的變量
1,GetBuffer函數:
使用CString::GetBuffer函數。
char * p;
CString str = " hello
p=str。GetBuffer(字符串。GetLength());
海峽。ReleaseBuffer()。
將CString轉換為char *時
CString str(" aaaaaaaa ");
strcpy(str。GetBuffer(10)," aa ");
海峽。ReleaseBuffer()。
當我們需要壹個字符數組的時候調用GetBuffer(int n),其中n是我們需要的字符數組的長度。請確保在使用後立即調用ReleaseBuffer()。
在可以使用const char *的地方避免使用它也是非常重要的。
2、memcpy:
CString mCS = _ T(" cxl ");
char mch[20];
memcpy(mch,mCS,20);
3.用LPCTSTR強制轉換:盡量不要用。
char * ch
CString字符串;
ch =(LPSTR)(LPCTSTR)str;
CString str = " good
char * tmp
sprintf(tmp," %s ",(LPTSTR)(LPCTSTR)str);
4、
CString Msg
Msg = Msg+“ABC”;
LPTSTR lpsz
新TCHAR。GetLength()+1];
_tcscpy(lpsz,Msg);
char * psz
strcpy(psz,lpsz);
從CString類到const char *的轉換
char a[100];
CString str(" aaaaaa ");
strncpy(a,(LPCTSTR)str,sizeof(a));
或者如下:
strncpy(a,str,sizeof(a));
以上兩種用法都是正確的。因為strncpy的第二個參數類型是const char *,所以編譯器會自動將CString類轉換為const char *。
CString到LPCTSTR (const char *)
CString
const char * lpctStr =(lpctStr)cStr;
LPCTSTR至CString
LPCTSTR lpctStr
CString cStr = lpctStr
將char*類型的變量賦給CString類型的變量。
可以直接賦值,例如:
CString myString = "這是壹個測試";
您也可以使用構造函數,例如:
CString s 1(" Tom ");
將CString類型的變量賦給char [](字符串)類型的變量
1,sprintf()函數
CString str = " good
char tmp[200];
sprintf(tmp," %s ",(LPCSTR)str);
(LPCSTR)str的強制轉換等效於(LPTSTR)(LPCTSTR)str。
當CString類的變量需要轉換為(char*)時,使用(LPTSTR)(LPCTSTR)str。
但是LPCTSTR是const char *,也就是結果字符串是不可寫的!強行將其轉換為LPTSTR並刪除const是極其危險的!
壹不小心就完了!要獲取char *,應該使用GetBuffer()或GetBufferSetLength(),使用後再調用ReleaseBuffer()。
2.strcpy()函數
CString字符串;
char c[256];
strcpy(c,str);
char mychar[1024];
CString source = " Hello
strcpy((char *)& amp;mychar,(LPCTSTR)source);
關於CString的使用
1,請指定CString參數。
對於大多數需要字符串參數的函數,最好將函數原型中的形參指定為指向字符的常量指針(LPCTSTR ),而不是CString。
當壹個參數被指定為指向壹個字符的常量指針時,這個指針可以被傳遞給壹個TCHAR數組(比如字符串["here"])或者壹個CString對象。
CString對象將自動轉換為LPCTSTR。任何可以使用LPCTSTR的地方也可以使用CString對象。
2.如果參數不會被修改,它也被指定為常量字符串引用(即constcstring & amp;)。如果函數想要修改字符串,
const修飾符被刪除。如果需要缺省為空值,將其初始化為空字符串[""],如下所示:
void add customer(const CString & amp;名稱、常數和字符串。地址,常數字符串和。評論= " ";
3.對於大多數函數結果,只需通過值返回CString對象。
字符串的基本操作
對於字符串的基本操作,很多高級語言都提供了相應的運算符或者標準庫函數來實現。
為了描述方便,先定義幾個相關變量:
char s1[20]="dir/bin/appl ",s2[20]="file.asm ",s3[30],* p;
int結果;
下面用C語言中的字符串操作來介紹字符串的基本操作。
1,求字符串長度
int strlen(char * s);//求字符串s的長度。
示例printf("%d ",strlen(s 1));//輸出s1的字符串長度是12。
2、字符串復制
char *strcpy(char *to,* from);//將from字符串復制到to字符串,並將指針返回到的開頭。
示例strcpy(s3,s 1);//S3 = "dir/bin/appl ",S1的字符串不變。
3.關系
char *strcat(char *to,char * from);//將from字符串復制到to字符串的末尾,
//並將指針返回到字符串的開頭。
示例strcat(s3,“/”);//s3="dir/bin/appl/"
strcat(s3,S2);//s3="dir/bin/appl/file.asm "
4.字符串比較
int strcmp(char *s1,char * S2);//比較s1和s2的大小,
//當s1
Example result=strcmp("baker "," Baker ");//結果& gt0
result=strcmp("12 "," 12 ");//結果=0
result=strcmp("Joe "," Joseph ")//result & lt;0
5.字符定位
char *strchr(char *s,char c);//找到c在字符串s中第壹次出現的位置,
//如果找到,返回位置,否則返回NULL。
示例p = strcr (S2,'.');//p指向“文件”之後的位置
if(p) strcpy(p,"。CPP”);//s2="file.cpp "
註意:
①以上操作是最基本的,其中後四個操作有變體形式:strncpy、strncath、strnchr。
②其他字符串操作參見< string.h & gt。在不同的高級語言中,字符串操作的類型和符號是不同的。
③剩下的字符串操作壹般可以由這些基本操作組成。
例如,查找子串的操作可以實現如下:
void substr(char *sub,char *s,int pos,int len){
//s和sub是字符數組,sub用於從字符串s的pos字符返回長度為len的子字符串。
//其中0
如果(pos & lt0 | | pos & gtstrlen(s)-1 | | len & lt;0)
錯誤("參數錯誤!");
strncpy(sub & amp;s[pos],len);//將s[pos]中最多len個字符復制到sub。