_银子

提供更专注、更专心、更专业的服务
  首页  :: 联系 :: 订阅 订阅  :: 管理

又碰 字符转化

Posted on 2011-10-14 15:19  _银子  阅读(344)  评论(0编辑  收藏  举报

 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 的缩写