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
cao::刚刚亲测之下,这话总转换方法好像不行的。大家有能解释的吗?
但以下方法可以:
关于CString::GetBuffer()函数参考关于CString::GetBuffer使用
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();
在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*;
一个基本方法可以这样做:
2、下面方法:
更多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本质
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
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- JavaScript中字符串(string)转json的2种方法
- C#中string用法实例详解
- C#中的DataSet、string、DataTable、对象转换成Json的实现代码
- Javascript实现Array和String互转换的方法