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

在工作中,我们经常遇到遇到一些不同类型之间的转换,因为近日遇到一些很多的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类型了  
    
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    但以下方法可以:

     CString m_cstrInputStr = L"Hello";
        USES_CONVERSION;
     string parens = W2A(m_cstrInputStr.LockBuffer());
     m_cstrInputStr.UnlockBuffer();
 
 
  • 1
  • 2
  • 3
  • 4

关于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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  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());
    
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

在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() ;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

更多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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随笔 - 764 文章 - 3 评论 - 196 CString,string,char*之间转换(转) 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。所以熟练掌握三者之间转换十分必要。 以下我用简单的图示指出三者之间的关系,并以标号对应转换的方法。 1 string to CString CString.format("%s",string.c_str()); 2 CString to string string str(CString.GetBuffer(str.GetLength())); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char,CString,sizeof(char)); 6 char * to CString CString.format("%s",char*); CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *转换时,要把char定义成为const char*,这样是最安全的。 以上函数UNICODE编码也没问题:unicode下照用,加个_T()宏就行了,像这样子_T("%s") 补充: CString 可能是 CStringW/CStringA,在与 string 转换时,如果是 CStringW,还涉及编码转换问题。下面以 CStringA 来说明。 1 string to CString CString.format("%s",string.c_str()); CStringA = string.c_str() 就可以了 2 CString to string string str(CString.GetBuffer(str.GetLength())); GetBuffer 有参数的话,可能导致内部的分配空间动作,要进行后续 ReleaseBuffer 操作。 string = CStringA string = CStringA.GetBuffer(); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char *,CString,sizeof(char)); 按照 3 风格,这里应该 char * = CStringA; 或者 char *p = CStringA.GetBuffer(); 6 char * to CString CStringA = char * 就可以了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值