C++处理字符串的方式有两种:
1.来自C语言,常被称为C-风格字符串(C-style string)【上一篇】
2.基于string类库的方法【本篇】
要使用string类,必须在程序中包含头文件string。string类位于名称空间std中,因此必须提供一条using编译指令,或者使用std::string来引用它。string类定义隐藏了字符串的数组性质,让您能够像处理普通变量那样处理字符串。
程序清单4.7说明了string对象与字符数组之间的一些相同点和不同点。
//程序清单4.7说明了string对象与字符数组之间的一些相同点和不同点。
#include<iostream>
#include<string>
using namespace std;
int main()
{
char charr1[20];//create an empty array
char charr2[20] = "jaguar";//create an initialized array
string str1;//create an empty string object
string str2 = "panther";//create an initialized string
cout << "Enter a kind of feline: ";
cin >> charr1;
cout << "Enter another kind of feline: ";
cin >> str1;
cout << "Here are some felines:\n";
cout << charr1 << " " << charr2 << " " << str1 << " " << str2 << endl;
cout << "The third letter in " << charr2 << " is " << charr2[2] << endl;
cout << "The third letter in " << str2 << " is " << str2[2] << endl;
system("pause");
return 0;
}
相同点:
· 可以使用C-风格字符串初始化string对象
·可以使用cin来将键盘输入存储到string对象中
·可以使用cout来显示string对象
·可以使用数组表示法访问存储在string对象中的字符
区别:可以将string对象声明为简单变量,而不是数组。
类设计让程序能够自动处理string的大小。例如,str1的声明创建一个长度为0的string对象,但程序将输入读取到str1中时,将自动调整str1的长度:
cin >> str1; //str1 resized to fit input
这使得与使用数组相比,使用string对象更方便,也更安全。
理论上看,可以将char数组视为一组用于存储一个字符串的char存储单元,而string类变量是一个表示字符串的实体。
赋值、拼接和附加
使用string类时,某些操作比使用数组时更简单。例如,不能将一个数组赋给另一个数组,但是可以将一个string对象赋给另一个string对象:
char charr1[20]; //create an empty array
char charr2[20] = "jaguar"; //create an initialized array
string str1; //create an empty string object
string str2 = "panther"; //create an initialized string
charr1 = charr2; //no array assignment
str1 = str2; //object assignment ok
string类简化了字符串合并操作。可以使用运算符+将两个string对象合并起来,还可以使用运算符+=将字符串附加到string对象的末尾。
string str3;
str3 = str1 + str2; //assign str3 the joined strings
str1 += str2; //add str2 to the end of str1
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "penguin";
string s2, s3;
cout << "You can assign one string object to another:s2 = s1\n";
s2 = s1;
cout << "s1: " << s1 << ",s2: " << s2 << endl << endl;
cout << "You can assign a C-style string to a string object.\n ";
cout << "s2 = \"buzzard\"\n"; //转义序列\"表示双引号
s2 = "buzzard";
cout << "s2: " << s2 << endl << endl;
cout << "You can concatenate strings:s3 = s1 + s2\n";
s3 = s1 + s2;
cout << "s3: " << s3 << endl << endl;
cout << "You can append strings.\n";
s1 += s2;
cout << "s1 += s2 yields s1 = " << s1 << endl;
s2 += " for a day";
cout << "s2 += \" for a day\" yields s2 = " << s2 << endl << endl;
system("pause");
return 0;
}
string类的其他操作
在C++新增string类之前,对于C-风格字符串,程序员使用C语言库中的函数来完成这些任务。头文件cstring提供了这些函数,例如,可以使用函数strcpy()将字符串复制到字符数组中,使用函数strcat()将字符串附加到字符数组末尾:
strcpy(charr1,charr2); //copy charr2 to charr1
strcat(charr1,charr2); //append contents of charr2 to charr1
程序清单4.9对用于string对象的技术和用于字符数组的技术进行了比较。
//程序清单4.9对用于string对象的技术和用于字符数组的技术进行了比较
#include<iostream>
#include<string>
using namespace std;
int main()
{
char charr1[20];
char charr2[20] = "jaguar";
string str1;
string str2 = "panther";
//assignment for string objects and character arrays
str1 = str2;
strcpy_s(charr1, charr2); //copy charr2 to charr1
//appending for string objects and character arrays
str1 += " paste";//add paste to end of sttr1
strcat_s(charr1, " juice");//add juice to end of charr1
//find the length of a string object and a C-style string
int len1 = str1.size();//obtain length of str1
//str1是一个对象,而size()是一个类方法。方法是一个函数,只能通过其所属类的对象进行调用
//在这里,str1是一个string对象,而size()是string类的一个方法
int len2 = strlen(charr1);//obtain length of charr1
cout << "The string " << str1 << " contains " << len1 << " characters.\n";
cout << "The string " << charr1 << " contains " << len2 << " characters.\n";
system("pause");
return 0;
}
string类I/O
//4.10 line input
#include<iostream>
#include<string>
using namespace std;
int main()
{
char charr[20];
string str;
//函数strlen()从数组的第一个元素开始计算字节数,直到遇到空字符
//对于未被初始化的数据,第一个空字符的出现位置是随机的,因此在运行该处时,得到的数组长度可能不同
cout << "Length of string in charr before input: " << strlen(charr) << endl;
//未被初始化的string对象的长度被自动设置为0
cout << "Length of string in str before input: " << str.size() << endl; //注意此处两种求长度的方法不同
cout << "Enter a line of text:\n";
//句点表示法表明,getline()是istream类的一个类方法,cin是一个istream对象
cin.getline(charr, 20);//该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
cout << "You entered: " << charr << endl;
cout << "Enter another line of text:\n";
//这里没有使用句点表示法,表明这个getline()不是类方法。也没有指出字符串长度的参数,因为string对象将根据字符串的长度自动调整自己的大小
getline(cin, str); //cin now an argument;no length specifier
cout << "You entered: " << str << endl;
cout << "Length of string in charr after input:" << strlen(charr) << endl;
cout << "Length of string in str after input: " << str.size() << endl;
system("pause");
return 0;
}