當前位置:成語大全網 - 書法字典 - lpctstr和cstring的區別

lpctstr和cstring的區別

CString LPCTSTR區別連接

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。