CString 和 string, char * , char[], 以及其他类型之间的互相转换小结

来源:互联网 发布:mac 怎么用f5 编辑:程序博客网 时间:2024/06/05 16:30

在工作中,我们经常遇到遇到一些不同类型之间的转换,因为近日遇到一些很多的CString和std::string 之间的转换, 这里简单总结一下与CString相关的一些类型准换。
CString本质
CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA。

  1. 浮点型数据,int ,与 CString 类字符串相互转
    将浮点型数据转换为CString类字符串直接用CString 的format函数进行格式化即可;
    显然 int 型转换为CString类字符串也直接用CString 的format函数进行格式化即可;
    eg: CString.Format(“%d”,int);

    CString类字符串转换成浮点型数据:
    Cstring str;
    double ss;

    CString类字符串转换成长整型数据:
    CString str ;
    long ld;
    ld = _wtol(str);

    CString转int类字符串转换成长整型数据:
    CString ss=”1212.12”;
    int temp=atoi(ss); //atoi _atoi64或atol

    将字符转换为整数,可以使用atoi、_atoi64或atol。
    int int_chage = atoi((lpcstr)ss) ;
    或:
    CString str = “23”;
    UINT uint;
    sscanf(str, “%d”, uint);

  2. CString与std::string 类型互转
    ## unicode环境下##
    CString to string

    CString str = "你好";CString stra(str.GetBuffer(0));// GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. str.ReleaseBuffer();string s(stra.GetBuffer(0));stra.ReleaseBuffer();或者:CString src = _T(“你好”); //在Unicode环境下面src是CStringW类型  CStringA temp = src.GetBuffer(0); //通过转化,temp接受了原来字符串的多字节形式  string dst = temp.GetBuffer(0); //现在就可以将值直接赋给string类型了  

    cao::刚刚亲测之下,这话总转换方法好像不行的。大家有能解释的吗?

    但以下方法可以:

     CString m_cstrInputStr = L"Hello";        USES_CONVERSION;     string parens = W2A(m_cstrInputStr.LockBuffer());     m_cstrInputStr.UnlockBuffer();

关于CString::GetBuffer()函数参考关于CString::GetBuffer使用

 string to CString    CString str;    string s;    str = CString(s);  //直接复制丢给构造会自己转换    或    str = s.c_str();     CString类型变量可以直接给string类型变量赋值,但是string类型不能对CString类型直接赋值。通过前两类  转换我们可以得到,string类型变量转换为const char*类型,然后再直接赋值就可以了。例如:   CString cstr;   sring str = “asdasd”;   cstr = str.c_str();  同理,CStrng类型变量先转换为string类型在调用c_str()函数就可以完成向const char*类型的转换。例如:  CString cStr = "adsad";     string str = cStr;    const char* pchar = str.c_str(); ## 非UNICODE(多字节码) ## 在非unicode环境下不存下编码问题,正常使用就行;
  1. CString 与 char* ,char[]互转;
    const char* to CString直接赋值或者格式化即可;
    CString.format(“%s”, char*);
    CString strtest;
    char * charpoint;
    charpoint=”give string a value”;
    strtest=charpoint; //直接赋值即可

    char[200] 转换成CString;
    char downPath[200];
    CString str.format(_T(“%s”), downPath) ;
    但是,如果数组中有中文话,在Unicode环境下就会出现乱码。这时要么进行转换,要么可以如下方法:CString str(downPath);或者 CString str = downPath.c_str();

        CString 转 char *    CString strtest="wwwwttttttt";     charpoint=strtest.GetBuffer(strtest.GetLength());     CString转换 char[100]      char a[100];      CString str("aaaaaa");      strncpy(a,(LPCTSTR)str,sizeof(a));      CString  str="aaa";        char*  ch;        ch=(char*)(LPCTSTR)str;char* 转 string  string s(char *); 在不是初始化的地方最好还是用assign().string 转 char * char *p = string.c_str();  string aa("aaa"); char *c=aa.c_str(); string mngName; char t[200]; memset(t,0,200);strcpy(t,mngName.c_str());

在Unicode下,CString与char* , char[]之间的转换;
如果在Unicode环境下直接进行强转是不行的,转换后只显示第一个字符而已;
eg: char pBuff[100];
CString str;
buf = (LPSTR)(LPCTSTR)str; ==> buf 中显示的只是第一个字符
strcpy(pNumber,strNumber); ==> error C2664: ‘strcpy’ : cannot convert parameter 2 from ‘class CString’ to ‘const char *’
sprintf(szTemp,”%s”,strTemp); ==> buf 显示的还是第一个字符
memcpy(pBuff,(LPCSTR)strBuf,strBuf.GetAllocLength()); ==>error C2440: ‘type cast’ : cannot convert from ‘class CString’ to ‘const char *’
char pBuff=strBuf.GetBuffer(0); ==> error C2440: ‘initializing’ : cannot convert from ‘unsigned short ’ to ‘char *’
如果强制转换,会报出这些错误。
转换方法很多其实, 我这里提供两种方法:
1、可以先将CString 转成 string ,然后将 string 转成 多字节的char*;
一个基本方法可以这样做:

    CString src = _T(“你好”); //在Unicode环境下面src是CStringW类型      CStringA temp = src.GetBuffer(0); //通过转化,temp接受了原来字符串的多字节形式      string dst = temp.GetBuffer(0); //现在就可以将值直接赋给string类型了       char * P = dst.c_str() ;    //注意上面如果不用CStringA 的话,可以:    CString str = "你好";    CString stra(str.GetBuffer(0));// GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.     str.ReleaseBuffer();    string s(stra.GetBuffer(0));    stra.ReleaseBuffer();    char * P = s.c_str() ;

2、下面方法:

    eg:    void SetPath(LPCTSTR szPath)     {            char szPicPath[MAX_PATH];            CString strPicPath = szPath;            WCharToMByte(strPicPath, szPicPath, MAX_PATH);            /////    }    BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)    {        memset(lpszStr,0,dwSize * sizeof(char));        DWORD dwMinSize;        dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);        if(dwSize < dwMinSize)        {            return FALSE;        }        WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);        return TRUE;    }

更多Unicode 下 CString 转换 char* 可参考:Unicode 下 CString 转换 char*
还可参考:Unicode 下 CString 转换 char*互转
以及 CString与char*_转换

CString在不同环境下的解析以及易错使用参考:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7387a8b8d5428c3933fcf331d5c1131a5e87c7c0d00d0c67e6203ae5e5c9daa702d691765eadb9e870d81e0c37538895763264b914163c468dbdc3725d621e01bafef42bbefe732e2b9a4d6c82720dd52752bc1b6cb015c41&p=882a9645dc9c02e605f6dc2d021481&newp=c957dc0d81934eac58e7cd2d021483231610db2151d3da4c&user=baidu&fm=sc&query=unicoede+%CF%C2string+%D7%AACString&qid=afb05837000d8aa2&p1=7

参阅以下三篇:[转换方法]http://www.cnblogs.com/wind-net/archive/2012/10/31/2746995.html
http://www.cnblogs.com/wind-net/archive/2012/10/31/2718340.html
http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html

1 0