C++中的字符串类型

C++提供了两种字符串的表示C。风格的字符串和标准。 C++引入的string 类类型一般
我们建议使用string 类。但实际上在许多程序的情形中我们有必要理解和使用老式的C 风
格字符串。在第7 章我们会看到一个例子。它处理命令行选项而这些选项被作为C 风格的
字符串数组传递给main()函数
1、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;
}

2、字符串类型
要使用string 类型必须先包含相关的头文件
#include <string>

例如下面是上一小节定义的字符数组
#include <string>
string st( "The expense of spirit\n" );

st 的长度由size()操作返回不包含终止空字符
cout << "The size of "<< st<< " is " << st.size()<< " characters, including the newline\n";
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( "world\n" );
我们可以按如下方式将两个字符串连接起来,形成第三个字符串
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";

这种连接策略比较受欢迎,因为它使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.com" );
int size = str.size();
for ( int ix = 0; ix < size; ++ix )
if ( str[ ix ] == '.' )
str[ ix ] = '_';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值