C++提供了两种字符串的表示。
C风格字符串
=============================
- 字符串被存储在一个字符数组中,一般通过一个char*类型的指针来操纵它。所以一般看到一个char*类型的指针,那就是C风格的字符串。该char*类型的指针指向的就是是该字符数组的第一个元素。
如
const char *st = "The expense of spirit\n";
- 如果想通过该指针来访问该字符串就要用到解引用符(*)。再配合循环语句和自增符(++)使用就可以实现访问字符数组中的单个字符了。
由于C 风格字符串的底层(low-level)特性, C 或C++的初学者很容易在这上面出错。要特别注意解引用以及指针位置的计算。
int string_length( const char *st ) { int cnt = 0; if ( st ) //一般来说当我们使用一个指针时,在解除指针的引用之前测试它是否指向某个对象是必要的 while ( *st++ ) //st被解引用,除了空字符外的任意字符都返回true值.注意:先计算++,再解引用 ++cnt; return cnt; }
- 标准C库为操纵C风格的字符串提供了一组函数。为使用这些函数,我们必须包含相关的C头文件 #include <cstring>
// 返回字符串的长度 int strlen( const char* );
// 比较两个字符串是否相等 int strcmp( const char*, const char* );
// 把第二个字符串拷贝到第一个字符串中 char* strcpy(char*, const char* );
字符串类型(标准C++引入的string类类型)
================================
因为字符指针的底层特性,用它表示字符串很容易出错。为了将程序员从许多与使用C风格字符串相关的错误中解脱出来,C++标准库提供
了字符串类抽象的一个公共实现。
- 特点:
1. 支持用字符序列或第二个字符串对象来初始化一个字符串对象。string str3( str1 ); 而C风格的字符串不支持。
2. 支持字符串之间的拷贝。=
3. 支持读写访问单个字符。通过下标操作符实现。 str[i]
4. 支持两个字符串的相等比较。 ==
5. 支持两个字符串的连接: 把一个字符串接到另一个字符串上, 或将两个字符串组合起来形成第三个字符串。 + 或 +=
6. 支持对字符串长度的查询。size()
7. 支持字符串是否为空的判断。empty()
- 要使用string类型,必须先包含相关的头文件: #include <string>
- string本质还是一个字符数组,所以迭代器begin() 和end()都可以用在string对象上。
replace( str.begin(), str.end(), '.', '_' );
//replace()扫描begin()和end()之间的字符。每个等于句号的字符都被替换成下划线
string对象与C风格字符串混用、转换
=================================
- 为了提高string对象的重用性,我们可以使用string对象与C风格字符串混用的方式。
string s1( "hello, " );
string s2( "world\n" );string s3 = s1 + s2;
换成:
const char *pc = ", ";
string s1( "hello" );
string s2( "world" );
string s3 = s1 + pc + s2 + "\n";
这种连接策略比较受欢迎因为它使s1 和s2 处于一种更容易被重用的形式。
- 转换:
string类型可以自动将C风格的字符串转化成string对象,例如:
string s1;
const char *pc = “a character array”;
s1 = pc;
但是string对象却不能自动转换成C风格字符串。可以通过c_str()来转换。
const char *str = s1.c_str(); //c_str()返回了一个指向常量数组的指针, 所以str必须要加上常量修饰符