String、Cstring、char*之间的关系与转换一直都是似懂非懂的,而且在MFC程序汇中也不知道什么时候有哪一个,一头雾水。。于是把网上的东西,结合之间的理解整理了一下。
一、概述
先说char*(这个是基础),因为其应该是最简单和最基础的,其从作用上讲就相当于一般的int*或者double*,这种基础的结构。但是由于字符串的特殊性,我们有单独用了其他类来处理。在c++中用了String类,而在MFC中用了Cstring类。所以,从根本上说,char*是最基本的,而string和cstring只是对char*的一个拓展而已。
二、比较
那么着三种的相互关系是什么呢?因为string和cstring都是对char*的拓展,我们可以知道他们都应该是对char*继续兼容的,这种兼容可以通过构造函数和operator=来进行。同时,如果高级的string和cstring要向低级的char*转换,就需要借助函数了。我们可以通过函数format进行。下面具体的给予说明:
1:同级之间的string和cstring
a:string到cstring
cstring.format("%s",string.c_str());
b:cstring到string
string s(cstring.getbuffer());
或者
cstring cstr; string s=sctr;
分析:a中是先把string通过函数c_str转换到char类型,在通过char类型转换成ctring。
b中的getbuffer是cstring的内部函数,其返回内存字符缓冲区的指针,这里也是相当于通过char进行转换的。
c中是通过赋值操作符进行转换。
2:低级的向高级的转换(char*到string或者cstring)
a:string到char*
前面已经提到string的c_str函数就是实现这个转换,即可以用string.c_str().
b:cstring到char*
前面也提到函数getbuffer可以实现这个转换,用ctring.getbuffer()即可,也可以通过LPCTSTR进行强制转换。
三、总结
这里可以看到这里面的中间过程还是基础的char*,记住string和cstring的两个函数string.c_str()和cstring.getbuffer()可以得到char*即可或者LPCTSTR强制转换。
四、附加的char,wchar_t,TCHAR的区别
这里涉及到两种编码方式ANSI和Unicode,一个是美国用的(American),一个是通用的(Universal)。因此,char对应的是ANSI,wchar_t对应的是Unicode,TCHAR是两种都兼容的。对于三者通常对应的字符串处理函数的头文件分别为str***,wcs***,_tcs***.
以strcpy函数为例子,总结一下:
如果你想使用ANSI字符串,那么请使用这一套写法:
char szString[100]; strcpy(szString,"test");
.如果你想使用Unicode字符串,那么请使用这一套:
wchar_t szString[100]; wcscpyszString,L"test"); .
如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:
TCHAR szString[100]; _tcscpy(szString,_TEXT("test"));
注:(MFC中大部分都是要求通用的即wchar_t,而c++一般定义的ANSI。)
他们之间的转换可以通过函数wcstombs(char* strDes, const wchar*, size_t nMax);这个函数的作用是把wchar转换为char。char* strDes 为保存转换后的普通字符串,wchar* 要被转换的宽字符串。转换的最大长度。这里的长度是转换的个数,而不是字节长度。mbstowcs() 就是一个相反的过程了。
参考:http://blog.csdn.net/yanonsoftware/article/details/544428