您的位置:首页 > 其它

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

2016-04-09 00:11 671 查看
在工作中,我们经常遇到遇到一些不同类型之间的转换,因为近日遇到一些很多的CString和std::string 之间的转换, 这里简单总结一下与CString相关的一些类型准换。

CString本质

CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA。

浮点型数据,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);

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环境下不存下编码问题,正常使用就行;


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cstring string