(一)首先说说string和char*:
1、概述
在C语言中: string是字符串,而char*是字符指针。二者不是在什么时候都等价,当字符指针指向的地址保存了一个字符串(即以‘\0’结尾的一个字符序列)时,可以说它指向了一个字符串,其它情况下则不等价。
在C++中: string是一个字符容器,它是模板库里的一个扩展模板类,而char是一个基本数据类型(C++的内置类型),二者就更不等价了。其中string有构造函数,char没有构造函数,只可以赋值(char* m="abc"; string str(m);)
2、二者的相互转化:
string转char*: 使用c_str()方法。std::string str="abc"; char* p=str.c_str();
char*转string: 直接使用初始化string s(char *),在不是初始化的地方,最好使用assign();
(二)CString
1、概述
CString 是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。能体现出 CString 类型方便性特点的一个方面就是字符串的连接,使用 CString 类型,你能很方便地连接两个字符串,正如下面的例子:
CString gray("Gray");CString cat("Cat");CString graycat = gray + cat;//then graycat="GrayCat"
要比用下面的方法好得多:
char gray[] = "Gray";char cat[] = "Cat";char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat,gray);strcat(graycat,cat);
2、CString和其它两者之间的转化
CString->std::string 例子:
CString strMfc=“test“; std::string strStl; strStl=strMfc.GetBuffer(0);
unicode情形下:
CStringW strw = _T("test");CStringA stra(strw.GetBuffer(0));strw.ReleaseBuffer();std::string imgpath=stra.GetBuffer(0);stra.ReleaseBuffer();
std::string->CString 例子:
CString strMfc; std::string strStl=“test“; strMfc=strStl.c_str();
CString->char* 例子:
强制类型转换LPCTSTR
LPCTSTR s;
或者
LPCTSTR(s);
使用Getbuffer():
不给 GetBuffer 传递参数时它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。当调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。 必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象.因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。
LPTSTR p = s.GetBuffer();// do something with pint m = s.GetLength(); // 可能出错!!!s.ReleaseBuffer();int n = s.GetLength(); // 保证正确