2009-02-25 15:52
在使用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"); 那么如果已经有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和原有类型的交互使用问题就解决了。 |