浅谈c++字符串——4 字符串,整数,浮点数之间的转换(VC++ Unicode下)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/q8250356/article/details/100641666

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_swchar_t*

    long value,

    char *str,

    size_t sizeOfstr,

    int radix

);

errno_t _ultoa_s( //_ultow_swchar_t*

    unsigned long value,

    char *str,

    size_t sizeOfstr,

    int radix

);

errno_t _ui64toa_s( //_ui64toa_swchar_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);

猜你喜欢

转载自blog.csdn.net/q8250356/article/details/100641666