C++中的字符串——string
在C语言中没有字符串这一数据类型,都是用字符数组来处理字符串,C++也支持这种C风格的字符串。除此之外,C++还提供了一种自定义数据类型——string, string是C++标准模板库(STL)中的一个字符串类,包含在头文件string中,它能更方便快捷的定义、操作字符串。用C++ string类来定义字符串,不必担心字符串长度、内存不足等情况,而且string类中重载的运算符和提供的多个函数足以完成我们所需要的所有操作,接下来我们就学习一下如何用string来定义字符串以及它提供的操作。
1、用string定义字符串
string是标准库的一个类,但是我们完全可以把它当作C++的一个基本数据类型来用,用string来定义字符串有如下几种方式:
string s1;
s1 = "hello C++"; //第一种方式
string s2 = "hello C++"; //第二种方式
string s3("hello C++"); //第三种方式
string s4(6, 'a'); //第四种方式
第一种方式定义字符串变量,再为字符串变量赋值;第二种方式用“=”符号为字符串变量赋值,这种方式与普通变量的定义相同;第三种方式是调用“()”运算符为字符串变量赋值;第四种方式有两个参数,它表示用6个字符’a’去初始化s4,初始化后s4的值为“aaaaaa”。
2、用[]来访问字符串中的字符
string类重载了“[]”操作符,所以可以用s[i]的形式来访问操作字符串中的字符。具体如例1所示。
例1
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 string s = "hello,C++";
7 s[7] = '-';
8 s[8] = '-';
9 cout << s << endl;
10 system("pause");
11 return 0;
12 }
运行结果如图1所示。
图1 例1运行结果
由图1所知,通过s[7]、s[8]将字符串中的字符‘+’修改成了‘-’。关于运算符重载我们将在第4章详细讲解,在这里读者只需了解即可。
3、直接用“+”运算符将两个string字符串连接
在C语言中,如果要连接两个字符串要调用strcat()函数,还要考虑存储的字符数组内存空间是否足够大。而在C++中,可以使用“+”运算符直接将两个string字符串连接,也不必考虑内存大小问题。接下来通过一个案例来演示,如例2所示。
例2
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 string s1, s2;
7 cout << "please input two strings:" << endl;
8 cin >> s1 >> s2;
9 cout << s1 + s2 << endl;
10 system("pause");
11 return 0;
12 }
运行结果如图2所示。
图2 例2运行结果
从图1-5所示,用户输入两个独立的字符串“hello”与“world”,通过“+”运算符直接将两个字符串连接在了一起。
4、可以直接比较两个string字符串是否相等
在C语言中,比较两个字符串是否相等需要调用strcmp()函数,而在C++中,可以直接调用>、<、!= 等运算符来比较两个string字符串。其用法如例3所示。
例3
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 string s1, s2;
7 cout << "please input two strings:" << endl;
8 cin >> s1 >> s2;
9 if (s1 > s2)
10 cout << "the first string is greater" << endl;
11 else if (s1 < s2)
12 cout << "the second string is greater" << endl;
13 else
14 cout << "two strings is equal"<<endl;
15 system("pause");
16 return 0;
17 }
运行结果如图3所示。
图3 例3运行结果
例3中分别调用了>、<、==运算符来比较字符串,用户输入了两个字符串,通过比较得出第一个字符串小于第二个字符串。读者还可输入不同的字符串来验证不同的结果。
5、length()和size()函数
string类也提供了一些获取字符串信息的函数,其中较为常用的就length()函数和size()函数,用于获取字符串长度,其函数声明如下所示:
int length() const;
int size() const;
这两个函数都用来获取字符串的长度,功能相同,类似于C语言中的strlen()函数,但strlen()函数只用于char*类型的字符串,而针对string类型的字符串,string类提供了自己的一些函数。接下来我们通过一个案例来演示这两个函数的用法,如例4所示。
例4
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 string s = "hello C++";
7 cout <<"size: "<< s.size() << endl;
8 cout <<"length: "<<s.length()<<endl;
9 system("pause");
10 return 0;
11 }
运行结果如图4所示。
图4 例4运行结果
由图4所示,用size()与length()两个函数求得字符串s的结果是一样的,都不包括末尾的’\0’。
6、swap()函数
swap()函数用来交换两个字符串的值,其函数声明如下所示:
void swap(string &s);
swap()函数用于交换当前字符串与字符串“s”的值,它只用于string类型的字符串,不能用于C风格的字符串。接下来通过一个案例来演示swap()函数的用法,如例5所示。
例5
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 string s1 = "hello C++";
7 string s2 = "chuan zhi bo ke!";
8 cout << "before swap: " << endl;
9 cout << "s1: " << s1 << endl << "s2: " << s2 << endl;
10 s1.swap(s2);
11 cout << "after swap: " << endl;
12 cout << "s1: " << s1 << endl << "s2: " << s2 << endl;
13 system("pause");
14 return 0;
15 }
运行结果如图5所示。
图5 例5运行结果
在例5中定义了两个字符串s1与s2,用swap()函数将两个字符串进行交换,如图5所示,结果显示交换成功。在交换过程中不必考虑字符串长度、内存不足等问题,直接调用函数即可。
值得一提的是,string是一个类,它所有的定义对象的格式、对字符串的操作处理都是类内部封装的一些函数,使用起来方便快捷,关于string类的其他常用函数,读者可参考附录I。关于类将在下一章中详细讲解。