1。C++提供了两种字符串的表示:c风格的字符串和标准C++引入的string。一般我们建议使用string类,但实际上在许多程序的情形中,我们有必要理解和使用老式的C风格字符串。
2.C风格字符串起源于C语言,并在C++中继续得到支持。字符串被存储在一个字符数组中,一般通过一个char*类型的指针来操作它。标准C库为操纵C风格的字符串提供了一组函数。例如:
int strlen(const char*) //返回字符串的长度
int strcmp(const char*,const char*) //比较两个字符串是否相等
char * strcpy(char*,const char*) //把第二个字符串拷贝到第一个字符串中
为了使用这些函数,我们必须包含相关的的头文件:#include<cstring>。
3.简而言之,C风格的字符串就是一个字符数组,即便当我们写一个字符串常量时,如:
const char *st="the expense pf spirit\n";
系统在内部也把字符串常量存储在一个字符串数组中,然后,st指向该数组的第一个元素。
4.C风格的字符串的长度可以为0(因而被视为空串),有两种方式:
char *pc1=0;//pc1不指向任何一个数组对象
const char *pc2="";//pc2指向空字符。
5.现在我们来看常常容易犯错的几个地方:
第一个,计算st的长度:
const char *st="the expense of spirit\n";
int main()
{
int len=0;
while(st++)
++len;
cout<<len<<";"<<st;
return 0;
}
这个错误在于,while的条件,我们的初衷是要字符串元素不为空时停止循环,而不是它的地址是否为空。即我们应该测试的是*st==null.而不是st==null.st永远也不会等于null,所以这是一个无限循环。
接下来我们这样修改:
const char *st="the expense of spirit\n";
int main()
{
int len=0;
while(*st++)
++len;
cout<<len<<";"<<st;
return 0;
}
注意这里的*st++,有必要解释一下,++的运算符高于*。所以先执行st++,在执行*。但是在后缀的时候,++是先使用st的值,然后再st+1.所以整个表达式的用法即是先*st,然后st自增1.
但是这个程序的错误在于没法输出字符串了,因为st所对应的地址在改变。所以当我要打出这串字符串的时候,st已经对应到空字符的后面一位去了。
稍作修改
const char *st="the expense of spirit\n";
int main()
{
int len=0;
const char*p=st;
while(*p++)
++len;
cout<<len<<";"<<st;
return 0;
}
这样便能实现功能。
6.还有一种字符串的表示方法是C++新增的字符串表达法。
因为字符数组(字符指针,或者说C风格字符串的底层特性),用它来表示字符串容易出错,所以C++标准库提供了字符串类抽象的一个公共实现。(string已经是一个类了,在这里,就跟向量一样,它有一套方法)
1.支持用字符序列或第二个字符串对象来初始化一个字符串对象。C风格的字符串不支持用另外一个字符串初始化一个字符串。
2.支持字符串之间的拷贝,C风格字符串通过使用库函数strcpy()来实现。
3.支持读写访问单个字符。对于C风格字符串,单个字符的访问由下表操作符或者直接解除指针引用来实现。
4.支持两个字符串的相等比较。对于C风格的字符串,字符串比较通过strcmp()来实现。
5.支持两个字符串的连接。把一个字符串接到另一个字符串上或将两个字符串组合起来形成第三个字符串。对于C 风格的字符串连接由库函数strcat()来实现。把两个字符串连接起来形成第三个字符串的实现是用strcpy()把一个字符串拷贝到一个新实例中,然后用strcat()把另一个字符串连接到新的实例上。
6.支持字符串长度的查询,对于C风格字符串,字符串长度由库函数strlen()返回。
7.支持字符串是否为空的判断。对于C风格字符串,通过下面两步条件测试来完成。
char*str=0;
if(!str||!*str)
return;
更多的string类型的操作可翻阅C++primer第三章的内容。