string,char*及CString类型的相互转换
Posted tianzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了string,char*及CString类型的相互转换相关的知识,希望对你有一定的参考价值。
首先先介绍一下什么是CString
CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA。
如从对话框中利用 GetWindowText 得到的字符串就是 CString 类型, CString 定义在头文件中。CString(typedef CStringT> CString) 为 Visual C++ 中最常用的字符串类,
继承自 CSimpleStringT 类,主要应用在 MFC 和 ATL 编程中,所以使用 CString 时要包含 afx.h 文件#include 。
一:char*与string:
1.string----->char*
1)char *ch = str.c_str();
2)char* ch = str.data();
3)string mngName;
char t[200];
memset(t,0,200);
strcpy(t,mngName.c_str());
2.char*----->string
1)string s1 = ch;
2)string str = string(ch);
3)string str(ch);
在不是初始化的地方最好还是用assign().
二:char*与CString:
1.CString----->char*:
1)CString cstr="Hello Word!";
char* ch=cstr.getbuffer(cstr.length());
2. char*----->CString:直接赋值或者格式化即可
1) CString cStr1 = ch;
2) CString cStr2 = CString(ch);
3)CString cStr2(ch);
但是,如果数组中有中文话,在Unicode环境下就会出现乱码。这时要么进行转换,要么可以如下方法:CString str(ch);或者 CString str = ch.c_str();
3.CString-----> char[100]:
1)char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
2)CString str="aaa";
char* ch;
ch=(char*)(LPCTSTR)str;
三:string与CString:
1.string----->CString
string s,s1,s2,s3;
CString cstr2,cstr;
1) str = CString(s); //直接复制丢给构造会自己转换
2) CString cstr(s1.c_str());
3)cstr2.Format("%s", s2.c_str());
4)cstr2.Format("%s", s3.data());
2.CString----->string
CString类型变量可以直接给string类型变量赋值,但是string类型不能对CString类型直接赋值。
CString cStr = "adsad",cstr3;
1)string str = cStr;
2)str=cstr3.GetBuffer(0); GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
str.ReleaseBuffer();
3)str = LPCSTR(cstr);
https://technet.microsoft.com/zh-cn/w6w3kbaf(zh-tw).aspx
https://technet.microsoft.com/zh-cn/ms235389
附:LPCSTR解释
LPCTSTR类型:
L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
STR表示这个变量是一个字符串
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
在程序中我们大部分时间要使用带T的类型定义。
LPCTSTR == const TCHAR *(TCHAR is wchar_t )
CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。
常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。
以上是关于string,char*及CString类型的相互转换的主要内容,如果未能解决你的问题,请参考以下文章