C++中的字符串类型
 
1.字符(串)表示分类
  C++提供了两种字符串的表示形式,即C风格的字符串和标准字符串。 C++引入的是string 类类型,但实际上在许多程序的情形中我们有必要理解和使用老式的C 风格字符串。总共包括以下几种类型:
  a.char 
  b.wchar_t
  c.TCHAR
  c.LPSTR
  d.LPCSTR
  e.LPTSTR
  f.LPCTSTR
  g.Cstring
  h.string
  i.BSTR
 
2.C风格字符串
  C 风格的字符串起源于C 语言并在C++中继续得到支持,实际上在标准C++之前除了第三方字符串库类之外它是惟一一种被支持的字符串。字符串被存储在一个字符数组中,一般通过一个char*类型的指针来操纵它,标准C 库为操纵C 风格的字符串提供了一组函数例如:
// 返回字符串的长度
int strlen( const char* );
// 比较两个字符串是否相等
int strcmp( const char*, const char* );
// 把第二个字符串拷贝到第一个字符串中
char* strcpy(char*, const char* );
标准C 库作为标准的C++的一部分被包含在其中为使用这些函数我们必须包含相关的C 头文件
#include <cstring>
指向C 风格字符串的字符指针总是指向一个相关联的字符数组,即使当我们写一个字符串常量时,如:
const char *st = "The expense of spirit\n";
系统在内部也把字符串常量存储在一个字符串数组中,然后st 指向该数组的第一个元素。那么我们怎样以字符串的形式来操纵st 呢?
一般地我们用指针的算术运算来遍历C 风格的字符串,每次指针增加1 直到到达终止空字符为止例如:
while ( *st++ ) { ... }
char*类型的指针被解除引用并且测试指向的字符是true 还是false 。true 值是除了空字符外的任意字符(空字符在判断语句中被莫认为是假),++是增加运算符它使指针指向数组中的下一个字符。
一般来说当我们使用一个指针时在解除指针的引用之前测试它是否指向某个对象是必要的,否则程序很可能会失败例如:
int
string_length( const char *st )
{
int cnt = 0;
if ( st )
while ( *st++ )
++cnt; return cnt;
}
 
3、C++字符串类型
要使用string 类型必须先包含相关的头文件
#include <string>
例如下面是上一小节定义的字符数组
#include <string>
string st( "The expense of spiritn" );
st 的长度由size()操作返回不包含终止空字符
cout << "The size of "<< st<< " is " << st.size()<< " characters, including the newlinen";
string 构造函数的第二种形式定义了一个空字符串,例如
string st2; // 空字符串
我们怎样能保证它是空的当然一种办法是测试size()是否为0
if ( ! st.size() )
// ok: 
更直接的办法是使用empty()操作
if ( st.empty() )
// ok: 空
如果字符串中不含有字符则empty()返回布尔常量true ,否则返回false
第三种形式的构造函数用一个string 对象来初始化另一个string 对象,例如
string st3( st );
将st3 初始化成st 的一个拷贝,怎样验证呢?等于操作符比较两个string 对象,如果相等则返回true
if ( st == st3 )
// 初始化成功
怎样拷贝一个字符串呢?最简单的办法是使用赋值操作符,例如
st2 = st3; // 把st3 拷贝到st2 中
首先将与st2 相关联的字符存储区释放掉,然后再分配足够存储与st3 相关联的字符的存储区。
最后将与st3 相关联的字符拷贝到该存储区中。
我们可以使用加操作符+ 或看起来有点怪异的复合赋值操作符+= 。将两个或多
个字符串连接起来。例如:给出两个字符串
string s1( "hello, " );
string s2( "worldn" );
我们可以按如下方式将两个字符串连接起来,形成第三个字符串
string s3 = s1 + s2;
如果希望直接将s2 附加在s1 后面那么可使用+= 操作符
s1 += s2;
s1 和s2 的初始化包含了一个空格一个逗号以及一个换行,这多少有些不方便,它们的存在限制了对这些string 对象的重用,尽管它满足了眼前的需要。一种替代做法就是混合
使用C 风格的字符串与string 对象。如下所示:
const char *pc = ", ";
string s1( "hello" );
string s2( "world" );
string s3 = s1 + pc + s2 + "n";
c++strcpy函数用法这种连接策略比较受欢迎,因为它使s1 和s2 处于一种更容易被重用的形式。这种方法
能够生效是由于string 类型能够自动将C 风格的字符串转换成string 对象。例如:这使我们可以将一个C 风格的字符串赋给一个string 对象。
string s1;
const char *pc = "a character array";
s1 = pc; // ok
但是反向的转换不能自动执行,对隐式地将string 对象转换成C 风格的字符串。string
类型没有提供支持,例如,
下面试图用s1 初始化str。 就会在编译时刻失败
char *str = s1; // 编译时刻类型错误
为实现这种转换必须显式地调用名为c_str()的操作
char *str = s1.c_str(); // 几乎是正确的但是还差一点
名字c_str()代表了string 类型与C 风格字符串两种表示法之间的关系。字面意思是给
我一个C 风格的字符串,表示——即指向字符数组起始处的字符指针。
但是这个初始化还是失败了,这次是由于另外一个不同的原因,为了防止字符数组被
程序直接处理,c_str()返回了一个指向常量数组的指针(下一节将解释常量修饰符const)
const char*
str 被定义为非常量指针所以这个赋值被标记为类型违例,正确的初始化如下
const char *str = s1.c_str(); // ok
string 类型支持通过下标操作符访问单个字符,例如在下面的代码段中,字符串中的
所有句号被下划线代替
string str( "fa.disney" );
int size = str.size();
for ( int ix = 0; ix < size; ++ix )
if ( str[ ix ] == '.' )
str[ ix ] = '_';
4. 基本类型转换
4.1.区别wchar_t,char,WCHAR
  ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。
  UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里:
  typedef unsigned short wchar_t;
  另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t
  wchar_t 可用字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如: wchar_t *szTest=L"This is a Unicode string.";
4.2.TCHAR
在C语言里面提供了 _UNICODE宏(有下划线),在Windows里面提供了UNICODE宏(无下划线),只要定了_UNICODE宏和UNICODE宏,系统就会自 动切换到UNICODE版本,否则,系统按照ANSI的方式进行编译和运行。只定义了宏并不能实现自动的转换,他还需要一系列的字符定义支持。
1. TCHAR
如果定义了UNICODE宏则TCHAR被定义为wchar_t。
typedef wchar_t TCHAR;
  否则TCHAR被定义为char typedef char TCHAR;
2. LPTSTR
  如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。
  typedef LPTSTR LPWSTR;
  否则TCHAR被定义为char typedef LPTSTR LPSTR;
  说明:在使用字符串常量的时候需要使用_TEXT(“MyStr”)或者_T("")来支持系统的自动转换。
4.3.BSTR
  BSTR是一个带长度前缀的字符串,主要由操作系统来管理的,所以要用api.主要用来和VB打交道的(VB里的string就是指它)要操作它的API函数有很多.比如SysAllocString,SysFreeString等等.
  vc里封装它的类如_bstr_t,及ATL中的CComBSTR等.
  一个 BSTR 由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌入的 null 值。
  BSTR 是以指针的形式进行传递的。(指针是一个变量,包含另外一个变量的内存地址,而不是数据。) BSTR 是 Unicode 的,即每个字符需要两个字节。 BSTR 通常以两字节的 null 字符结束。 wstr是宽字符,以双字节表示一个字符 bstr是为了与原先的basic字符兼容,它的最前面的4个字节为其长度,以'\0'结束.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。