CString、string、char*之间的转化

CString、string、char*之间的转化

CString:MFC中定义的字符串类型,有很多很方便的操作函数,如Format函数(可以将各种类型转化为CString类型)
string:C++中标准字符串类
char*,char[]:C风格字符串,以'\0'结尾

1.char*转string

方法直接转化:

char* cstr = "Hello!";
string str;
str = cstr;

2.string转char*

利用string类的c_str()或data()函数,这两个函数返回的都是const char*类型,故无法对返回的C风格字符串进行修改。

string str("Hello!");   //这里其实就包含了小节1,采用的C风格字符串进行string的初始化
const char* = str.c_str;
//或者
const char* cstr= str.data();

注:c_str()与data()区别
  c_str()是标准做法,返回的是C风格字符串(以'\0'结尾),而data()返回的是原始string数据,不一定以'\0'结尾。c_str()中其实调用了data(),不过在调用前进行了判断,如果没有以'\0'结尾则补上'\0',故在转化C风格字符串时c_str()更保险,不过data()效率更高。
  

3.CString与char*转化

这里就要分为两种情况:MBCS编码与Unicode编码

3.1 MBCS编码:此时CString是CStringA

(1) CString转char*
法一:CString直接调用GetBuffer即可将CString转化为char*

CString cstring= "Hello!";          //MFC中其实等同于 CString cstring = _T("Hello!"); 
char* cstr = cstring.GetBuffer(0);
CString。ReleaseBuffer();          //一般使用完GetBuffer要调用ReleaseBuffer

法二:使用LPCTSTR转化,CString中有operator LPCTSTR(){...}转换函数,一般需要const char*时传入CString都会自动调用LPCTSTR()隐式转换

CString cstring ="Hello";  
const char *cstr = (LPCSTR)cstring;     //LPCTSTR转换后返回的是const char*类型
char* *cstr1 = (LPSTR)(LPCSTR)cstring;  //这种方法将 const char* 强制转换成 char* 使用,不安全,不建议使用

(2) char*转CString
(I)CString的构造函数就可将char*转化为CString;
(II)直接转换;
(III)利用Format函数

char* cstr = "Hello!";
CString cstring1(cstr);      //(I)
CString cstring2 = cstr;     //(II)
CString cstring3;
cstring.Format(_T("%s"), cstr)  //(III)

3.2 Unicode编码:此时CString是CStringW

方法:
  (I)使用L转换宏USES_CONVERSION
   头文件MFC下:#include "afxconv.h"
   ATL下:#include "atlconv.h "
  (II)使用windows API: MultiByteToWideChar与WideCharToMultiByte(这里不介绍了)

(1) CString转char*
使用T2A或W2A

CString cstring= L"Hello!";          //MFC中其实等同于 CString cstring = _T("Hello!"); 
USES_CONVERSION
char* cstr  = T2A(cstring);

(2) char*转CString
使用A2T或A2W

char* cstr = "Hello!";
USES_CONVERSION
CString cstring = A2T(cstr);

(3)使用USES_CONVERSION注意事项:它们从堆栈上分配内存,直到调用它的函数返回,该内存不会被释放。故不要在大量调用的地方使用,如循环,否则很容易引起堆栈溢出。

(4)条件判断转换方法
经常我们在类型转换时会利用编码方式自动选择转换方法,使程序适应多种编码方式。利用是否定义宏UNICODE和_UNICODE
UNICODE:用于Windows头文件
_UNICODE:用于C运行时(CRT)头文件

CString cstring = _T("Hello!"); 
#ifndef UNICODE
char* cstr = cstring.GetBuffer(0);
#else
USES_CONVERSION
CString cstring = T2A(cstr); 
#endif

当然可以选择利用defined(宏名称)将UNICODE与_UNICODE都加入判断

CString cstring = _T("Hello!"); 
#if defined(UNICODE) || defined(_UNICODE)
char* cstr = cstring.GetBuffer(0);
#else
USES_CONVERSION
CString cstring = T2A(cstr); 
#endif

补充

  C++中string类的to_string函数可以把多种类型(int、double、float、unsigned int等)转换为string类型。

posted on 2016-12-04 17:27  silentteen  阅读(523)  评论(0编辑  收藏  举报