您的位置:首页 > 其它

又碰 字符转化

2011-10-14 15:19 183 查看
C++里用到的数据类型有很多,编程过程中很容易混用,下面综合看到的资料(由衷感谢无私共享的前辈们)对此进行简单的解析

一、1.常见字符的意义:
L:代表LONG
W:代表WIDE,也就是OLE,代表宽字节字符
P:代表POINTER
A:代表ANSIC,也就是MBCS多字节字符
S:代表String,有时用STR表示
C:代表Const
T:代表中间类型,即如果定义了_UNICODE则代表宽字节,如果定义了_MBCS则代表了多字节字符
2:代表TO ,意味转换为
2. char和CString
例如:(1)char * a="hello";
CString str=a;
(2)CString str="hello";
char * a;
a=str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
(3)CString str="hello";
char a;
a=str.GetAt(i);
str.ReleaseBuffer();
(4)CString str="hello";
char a[100];
strcpy(a,str);
(5)CString mCS=_T("cxl");
char mch[20];
memcpy(mch,mCS,20);
(6)char *ch;
CString str;
ch=(LPSTR)(LPCTSTR)str;

3.int,float,double和CString
例如:(1)CString strval="12.43aa";
char* pChar1=strval.GetBuffer(strval.GetLength());
float fval=atof(pChar1);
double dval=atof(pChar1);
int ival=atoi(pChar1);
(2)CString str;
str.Format("%d",23);
str.Format("%f",23.0);
4.string 和 CString
例如:(1)
5.CString和BSTR和LPCTSTR和LPSTR和LPCSTR和LPOLESTR
CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,如:SysAllocString和SysFreeString函数,指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用),LPCTSTR只是一个常量的TCHAR指针,LPSTR是一个CHAR指针,LPCSTR是一个常量CHAR指针,LPOLESTR是一个宽字节指针。
可以这样说:CString是LPSTR等的封装类,CComBSTR是BSTR的封装类。
例如:(1)CString str= "2008北京奥运";
LPSTR buf = (LPSTR)(LPCTSTR)str;
(2)LPCTSTR lpctStr;
CString cStr=lpctStr;
(3)CString str="2008北京奥运";
BSTR bstr=str.AllocSysString();
(4)使用WideCharToMultiByte或者WideCharToMultiByte进行宽字节字符串和多字节字符串之间的转换

补充:在程序中使用各种字符集的方法:
const char * p = "Hello"; // 使用 ASCII 字符集
const char * p = "你好"; // 使用 MBCS 字符集,由于 MBCS 完全兼、、//容 ASCII,多数情况下,我们并不严格区分他们
LPCSTR p = "Hello,你好"; // 意义同上

const WCHAR * p = L"Hello,你好"; // 使用 UNICODE 字符集
LPCOLESTR p = L"Hello,你好"; // 意义同上

// 如果预定义了_UNICODE,则表示使用UNICODE字符集;如果定义了_MBCS,则表示使用 MBCS
const TCHAR * p = _T("Hello,你好");
LPCTSTR p = _T("Hello,你好"); // 意义同上
  在上面的例子中,T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集那?嘿嘿......编译的时候决定吧。
由于BSTR的指针就是指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用,但一定要注意:
  有函数 fun(LPCOLESTR lp),则你调用 BSTR p=...; fun(p); 正确
  有函数 fun(const BSTR bstr),则你调用 LPCOLESTR p=...; fun(p); 错误!!!

6.VARIANT
例如: (1)VARIANT v; v.vt=VT_I4; v.lVal=100;
(2)VARIANT v; v.vt=VT_BOOL; v.boolVal=VARIANT_TRUE;
(3)VARIANT v;
v.vt=VT_BSTR;
v.bstrVal=SysAllocString(L"Hello,你好");
(4)可以使用现成的包装类 CComVariant、COleVariant、_variant_t。比如上面三个问题就可以这样书写:
CComVariant v1(100),v2(true),v3("Hello,你好");
二、串的基本运算
对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实现。
为叙述方便,先定义几个相关的变量:
char s1[20]="dir/bin/appl",s2[20]="file.asm",s3[30],*p;
int result;
下面以C语言中串运算介绍串的基本运算
1、求串长
int strlen(char *s); //求串s的长度
对于宽字节字符串要用wcslen
【例】printf("%d",strlen(s1)); //输出s1的串长12
LPCOLESTR lpw = L"Hello,你好";
size_t wLen = wcslen( lpw ) + 1;

2、串复制
char *strcpy(char *to,*from);//将from串复制到to串中,并返回to开始处指针
【例】strcpy(s3,s1); //s3="dir/bin/appl",s1串不变

3、联接
char *strcat(char *to,char *from);//将from串复制到to串的末尾,
//并返回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<s2、s1>s2和s1=s2时,分别返回小于0、大于0和等于0的值
【例】result=strcmp("baker","Baker"); //result>0
result=strcmp("12","12"); //result=0
result=strcmp("Joe","joseph") //result<0
5、字符定位
char *strchr(char *s,char c);//找c在字符串s中第一次出现的位置,
//若找到,则返回该位置,否则返回NULL
【例】p=strchr(s2,'.'); //p指向"file"之后的位置
     if(p) strcpy(p,".cpp"); //s2="file.cpp"
注意:
 ①上述操作是最基本的,其中后 4个操作还有变种形式:strncpy,strncath和strnchr。
 ②其它的串操作见C的<string.h>。在不同的高级语言中,对串运算的种类及符号都不尽相同
 ③其余的串操作一般可由这些基本操作组合而成
【例】求子串的操作可如下实现:
void substr(char *sub,char *s,int pos,int len){
//s和sub是字符数组,用sub返回串s的第pos个字符起长度为len的子串
//其中0<=pos<=strlen(s)-1,且数组sub至少可容纳len+1个字符。
if (pos<0||pos>strlen(s)-1||len<0)
Error("parameter error!");
strncpy(sub,&s[pos],len); //从s[pos]起复制至多len个字符到sub

6、使用 ATL 提供的转换宏串转换(使用之前要先调用USES_CONVERSION宏):
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T

上表中的宏函数,其实非常容易记忆:
2 好搞笑的缩写,to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。
A ANSI 字符串,也就是 MBCS。
W、OLE 宽字符串,也就是 UNICODE。
T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
C const 的缩写
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: