Cstring、string、float、int、double之间的转换
(多字节字符 英文1个字节,中文2个字节 ,unicode 英文2字节 中文2字节)
一,宽字节wchar_t* 和 单字节char*之间的转换
wchar_t是Unicode字符的数据类型,它实际定义在<string.h> 里: typedef unsigned short wchar_t;不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。
wchar_t *wsz = L"wchar_t";
// 使用CString必须使用MFC,并且不可包含<windows.h>
(1)将单字节char* 转换为 宽字节 wchar*
inline wchar_t* AnsiToUnicode( const char* szStr )
{
int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
if (nLen == 0)
{
return NULL;
}
wchar_t* pResult = new wchar_t[nLen];
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
return pResult;
}
(2)将宽字节wchar_t* 转换 单字节char*
inline char* UnicodeToAnsi( const wchar_t* szStr )
{
int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
if (nLen == 0)
{
return NULL;
}
char* pResult = new char[nLen];
WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
return pResult;
}
(3) 将单字符 string 转换为宽字符 wstring
inline void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )
{
int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
wszStr.resize(nLength);
LPWSTR lpwszStr = new wchar_t[nLength];
MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
wszStr = lpwszStr;
delete [] lpwszStr;
}
二,string、float、int、double,char*,wchar_t之间的转换
(1)短整型(int)转string
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); ///按二进制方式转换
(2)长整型(long)转string
ltoa(l,temp,10);
(3)浮点数(float,double)转string
用fcvt可以完成转换,这是MSDN中的例子:
int decimal, sign;
char *buffer;
double source = 3.1415926535;
buffer = _fcvt( source, 7, &decimal, &sign );
运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小数点的位置,sign表示符号:0为正数,1为负数
(4)CString变量转string
str = "2008北京奥运";
非Unicode
①buf = (LPSTR)(LPCTSTR)str;
②string buf(str.Getbuffer());
str.ReleaseBuffer();
Unicode
先转成char*,再直接赋值
temp="123456";
(5)短整型(int)
i = atoi(temp);
(6)长整型(long)
l = atol(temp);
(7)浮点(double)
d = atof(temp);
string s; d= atof(s.c_str());
(8)string转char*
string 是c++标准库里面其中一个,封装了对字符串的操作
把string转换为char* 有3中方法:
1。data
如:
stringstr="abc";
char *p=str.data();
2.c_str
如:string str="gdfd";
char *p=str.c_str();
3 copy
比如
string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
cout < <p;
(9)string转wchar_t
#include <stdlib.h>
string str = "hello";
wchar_t* wsz;
wsz = new wchar_t[str.size()];
mbstowcs(wsz, str.c_str(),str.size());
三,Cstring、string、float、int、double之间的转换
unicode下数据类型转换:
CString转string
CString b="1234" ;
USES_CONVERSION;
string a(W2A(b));
string转CString
string str="123";
CString cstr(str.c_str());//或者CString cstr(str.data());初始化时才行
cstr=str.c_str();或者cstr=str.data();
CString转int
CString b="123";
int i;
i=_ttoi(b); //在使用多字符集下 _atoi(array to integer 的缩写)函数是一个好的选择,它也很少会是一个正确的选择。而在使用 Unicode 字符,你应该用_ttoi(),它在 ANSI 编码系统中被编译成_atoi()
int型转CString型
CString a;
int b=20;
a.Format(_T("%d"),b); //_T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式,TEXT,_TEXT 和_T 是一样的
CString型转double型
CString strs;
double f;
f=_ttol(strs);
CString型转float型
CString strs;
float flt;
flt = (float)atof((char *)(LPTSTR)(LPCTSTR)strs);