在工作中,我们经常遇到遇到一些不同类型之间的转换,因为近日遇到一些很多的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- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
cao::刚刚亲测之下,这话总转换方法好像不行的。大家有能解释的吗?
但以下方法可以:
- 1
- 2
- 3
- 4
关于CString::GetBuffer()函数参考关于CString::GetBuffer使用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
-
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();- 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*;
一个基本方法可以这样做:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2、下面方法:
- 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*_转换
参阅以下三篇:[转换方法]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