CHAR、WCHAR、TCHAR、LPSTR和LPCSTR

在使用C++开发程序的时候,处理文本比较麻烦。主要是由于历史的原因。C++对于字符的标注类型是char.但是没有定义char的大小。默认为一个字节,这样就不能处理Unicode了。所以C++标准将这个问题留给了开发者。
微软在使用C/C++的时候,为了处理这个问题,就定义了几个typedef。那就是CHAR、WCHAR、TCHAR、LPSTR和 LPCSTR,其中:
CHAR 表示一个字节的字符
WCHAR 表示两个字节的字符
TCHAR 根据编译条件可能为CHAR,也可能为WCHAR.
LPSTR和 LPCSTR 类型其实是一样的。都被定义为 CHAR*. 也就是单字节字符串指针。其结尾处有一个'/0'表示字符结束。也就是C风格的字符串.
STL 推出后,又出来了一种新类型string.string 作为C++的一级类型。我们在代码中应该首选使用。只有需要和旧代码结合的地方才使用C方式的字符串。
为了和旧的C风格的字符串共同工作。STL中的string 提供了下面的方法:
const charT* c_str() const
const charT* data() const
size_type copy(charT* buf, size_type n, size_type pos = 0) const
其中:
1.c_str 直接返回一个以/0结尾的字符串。
2.data 直接以数组方式返回string的内容,其大小为size()的返回值,结尾并没有/0字符。
3.copy 把string的内容拷贝到buf空间中。
对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几 个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看 Effective STL的条款15: 小心string实现的多样性
另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:
 
string strinfo("this is Winter");
...
//最好的方式是:
foo(strinfo.c_str());
//也可以这么用:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使用了pstr了, 下面的操作已经使pstr无效了。
strinfo += " Hello!";
foo(pstr);//错误!
会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。

那么如果已经有C风格字符串,如果转化为string 呢?
我们通过看string.h,就会发现string 定义了构造方法和赋值操作符来完成这个过程。
basic_string(const _CharT* __f, const _CharT* __l, const allocator_type& __a = allocator_type())
basic_string& operator=(const _CharT* __s)
basic_string& operator=(_CharT __c)
这样string和原有类型的交互使用问题就解决了。

你可能感兴趣的:(char,wchar,LPCSTR,LPSTR,TCHAR)