【C++ Primer Plus学习记录】字符串——C++ string类

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值