4 字符串,整数,浮点数之间的转换(VC++ Unicode下)
4.1 CString 类和string类及char*间转化
CString是MFC类,而string为C++标准库字符串
4.1.1 CString -> string
CString cstr = _T("test"); USES_CONVERSION; string str(W2A(cstr)); //初始化方式 //或者使用赋值方式: //string str; //str = T2A(cstr);// T2A(),W2A()其实是将CString转化为char*,而char*可以直接赋值给string |
注:在多字节字符集情况下还可以用以下方式转换
CString cstr=_T("aaaaab"); std::string str(cstr.GetBuffer()); cstr.ReleaseBuffer();//使用GetBuffer必须释放ReleaseBuffer释放缓冲区所占的空间 |
4.1.2 string -> CString
CString cstr; string str = "test"; //或者使用string str("dsad");,注:给string赋值不用_T(),因为不是Unicode编码 cstr.Format(_T("%s"),CStringW(str.c_str())); //str.c_str()将string转换成char*,CStringW表示宽字节 |
4.1.3 CString ->char*
方一:
CString cstr=_T("test"); int len = WideCharToMultiByte(CP_ACP,0, cstr,cstr.GetLenth(),NULL,0,NULL,NULL); //第一第二参数暂不讨论,第三,第四为宽串缓冲区及其串长,第五为接受转换后串的缓冲区,第六是接收缓冲区的最大长度,最后俩暂不讨论。当第五第六参数为空时,函数返回第四参数值,即宽串长 char *ch = new char[len + 1]; WideCharToMultiByte (CP_ACP,0,cstr,cstr.GetLenth(),ch,len+1,NULL,NULL); //这样就转换成功 |
方二:
CString cstr=_T("test"); char *ch = new ch[cstr.GetLenth()]; USES_CONVERSION; ch = T2A(cstr); |
注:在多字节字符集编译环境下中可以使用下方法
char a[100]; CString str("aaaaaab"); strncpy_s(a, (LPCTSTR) str, sizeof(a)); |
4.1.4 string -> char*
方一:
string str = "test"; //或者使用string str("dsad"); char *ch = new char[str.length()]; strcpy(ch,str.c_str()); //str.c_str()将string转换成char* //也可以用str.data()转string为char*,两个函数的区别在于c_str()会用'\0'字符作为转换后字符串//的结尾,而data()函数则只会返回原始数据序列不会自动添加'\0'。 |
方二:
size_type _Copy_s( value_type *_Dest, //组件将复制的目标字符数组_Dest size_type _Dest_size, // _Dest的大小。 size_type _Count, //从源字符串将复制的,至多,字符数 size_type _Off = 0 //在复制将进行的源字符串的开始位置 ) const; //返回实际复制的字符数 |
string str = "abcd"; char ch[10] = "\0"; str._Copy_s(ch,sizeof(ch),str.length(),1); |
4.1.5 char* -> string
方一:
char ch[10] = "dadadad"; string str = ch; //char*给string赋值直接赋 |
方二:assign()
string &operator=(const string &s);//把字符串s赋给当前字符串 string &assign(const char *s);//用c类型字符串s赋值 string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值 string &assign(const string &s);//把字符串s赋给当前字符串 string &assign(int n,char c);//用n个字符c赋值给当前字符串 string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串 string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串 |
string str1, str2 = "War and Peace"; str1.assign(str2, 4, 3); cout << str1 << endl; |
4.1.6 char* -> CString
方一:
char ch[10] = "dadadad"; CString cstr(ch); //直接用char*来初始化CString |
方二:
char ch[10] = "dadadad"; CString cstr; cstr.Format(_T("%s"),(CStringW)ch); |
4.2 CString类和string类及char*与int类型或float类型互转
4.2.1 CString/string -> int(借助char*)
CString cstr = _T("100"); //string str = "100";其他类似 USES_CONVERSION; int num = atoi(T2A(cstr)); num = num + 100; cstr.Format(_T("%d"),num); |
4.2.2 int -> CString/string
(1)int -> CString
CString cstr; int num = 1000; cstr.Format(_T("%d"), num); |
(2)int -> string(借助char*)
string str; int num = 100; char ch[100]; ch[0] = '\0'; str = itoa(num,ch,10); //第一参数为要转的整数,第二未接受char*,第三个参数是进制(权值) |
4.2.3 CString/string -> float(借助char*)
CString cstr = _T("100.142"); //string str = "100.142";其他类似 USES_CONVERSION; float num = atof(T2A(cstr)); |
4.2.4 float -> CString/string
(1)float -> CString
CString cstr; float num = 1.11111f; //若不带f后缀,默认为double类型 cstr.Format(_T("%f"),num); //float转CString会存在不精确的想象,若想达到要求精确值可以自行 //编写函数,利用字符数组 |
(2)float -> string(借助char*)
string str; float num = 100.012000f; char ch[100]; ch[0] = '\0'; sprintf(ch,"%f",num); //同样由float转string不精确 str = ch; |
4.2.5 int -> char*
int num = 100; char ch[100]; ch[0] = '\0'; itoa(num,ch,10); //第一参数为要转的整数,第二未接受char*,第三个参数是进制(权值) |
4.2.6 float -> char*
float num = 100.012000f; char ch[100]; ch[0] = '\0'; sprintf(ch,"%f",num); //同样由float转string不精确 |
4.3 其他字符串转换
4.3.1 wchar_t <-> char*(多字节<->宽字节)
(1)char* -> wchar_t
char workFilePath[1000] = "test"; wchar_t workfp[1000] = _T("\0"); ::MultiByteToWideChar(CP_ACP, 0, workFilePath, strlen(workFilePath), workfp, sizeof(workfp)); //多字节字符集转Unicode字符集 |
wchar_t wch[30]=_T("\0"); size_t nwch; char mbch[13] = "aaaaaa"; ::mbstowcs_s(&nwch, wch,sizeof(wch), mbch, strlen(mbch)); //参数依次:实际转化的字符数(就多字节而言);宽字节数组的地址;宽字节数组的长度;多字节数组的地址;好转化的多字节字符数 |
(2)wchar_t -> char*
char workFilePath[1000] = ”\0”; wchar_t workfp[1000] = _T("test"); ::WideCharToMultiByte(CP_ACP, 0,currentFilePath,wcslen(currentFilePath), pFileName, sizeof(pFileName), NULL,NULL); //Unicode字符集转多字节字符集 |
15.3.2 int ,__int64 , unsigned __int64 -> char*
errno_t _itoa_s( int value, char *buffer, size_t sizeInCharacters, int radix ); errno_t _i64toa_s( __int64 value, char *buffer, size_t sizeInCharacters, int radix ); errno_t _ui64toa_s( unsigned _int64 value, char *buffer, size_t sizeInCharacters, int radix ); |
15.3.3 int ,__int64 , unsigned __int64 -> wchar_t*
errno_t _itow_s( int value, wchar_t *buffer, size_t sizeInCharacters, int radix ); errno_t _i64tow_s( __int64 value, wchar_t *buffer, size_t sizeInCharacters, int radix ); errno_t _ui64tow_s( unsigned __int64 value, wchar_t *buffer, size_t sizeInCharacters, int radix ); |
15.3.4 long ,unsigned long ,unsigned long long -> char*/wchar_t*
errno_t _ltoa_s( //_ltow_s转wchar_t* long value, char *str, size_t sizeOfstr, int radix ); errno_t _ultoa_s( //_ultow_s转wchar_t* unsigned long value, char *str, size_t sizeOfstr, int radix ); errno_t _ui64toa_s( //_ui64toa_s转wchar_t* unsigned long value, // typedef long int int64_t; char *buffer, size_t sizeInCharacters, int radix ); |
15.3.1 unsigned long long -> wchar_t -> CString
ULONGLONG ull = 6263646464; wchar_t wch[50] = _T("\0"); ::_ui64tow_s(ull, wch, sizeof(wch), 10); CString str(wch); |