String,Cstring和char*的区别和转换和char,wchar_t,TCHAR的区别

时间:2022-12-09 20:15:29

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