C++每日一课(十一)

string类


在C++中可以使用String类来存储字符串类型而不是字符数组来存储。
要使用String类,必须在程序中包含头文件string。string包含在名称空间std当中。因而在使用过程中必须使用using编译指令或者使用std::string来引用它。

/*
作者:xiesheng
时间:2017-07-02
版本:v1.0
说明:字符串类String
*/


#include <iostream>
#include <string>	//要使用String类,必须要包含这个头文件


int main() {


	using namespace std;
	char charr1[20];	//创建一个空的字符数组
	char charr2[20] = "hello!";		//创建一个带初始化的字符数组


	string str1;	//创建一个空的字符串对象
	string str2 = "world!";
	cout << "请输入一个字符串来为字符数组charr1赋值:";
	cin >> charr1;
	cout << "请输入一个字符串来为字符串对象str1赋值:";
	cin >> str1;
	cout << "charr1:" << charr1 << endl;
	cout << "charr2:" << charr2 << endl;


	cout << "str1:" << str1 << endl;
	cout << "str2:" << str2 << endl;


	cout << "charr2中的第三个字符是:" << charr2[2] << endl;
	cout << "str2中第三个字符是:" << str2[2] << endl;


	system("pause");
	return 0;
}




请输入一个字符串来为字符数组charr1赋值:china
请输入一个字符串来为字符串对象str1赋值:good
charr1:china
charr2:hello!
str1:good
str2:world!
charr2中的第三个字符是:l
str2中第三个字符是:r
请按任意键继续. . .


从上面可以看出
1.string对象可以使用C风格字符串来初始化
2.可以使用cin来把键盘输入的值存储到string对象中
3.可以使用cout来显示string对象中的字符串值
4.可以使用数组表示法来访问存储在string对象中的某个字符


注意:对于string的大小来说是程序来自动调整的
当string str2; 这个时候声明创建一个长度为0的字符串对象
cin >> str2; 这个时候会随着读取到str2中字符的长度来对str2的长度做调整


C++风格的字符串初始化也是支持的,比如:
string str1 = {"hello world!"};
string str2{"hello world!"};


string对象的赋值、拼接各附加
1.使用string类时,可以把一个string对象赋值给另一个string对象,这个对于字符数组是做不到的
2.字符串的合并操作可以使用运算符+号来进行操作
3.对字符串的附加可以使用操作符+=


/*
作者:xiesheng
时间:2017-07-02
版本:v1.0
说明:字符串类String
*/


#include <iostream>
#include <string>	//要使用String类,必须要包含这个头文件


int main() {


	using namespace std;


	string s1 = "小谢";
	string s2, s3;
	cout << "你可以把一个字符串赋值给另一个字符串,s2 = s1" << endl;
	s2 = s1;
	cout << "s1:" << s1 << " s2:" << s2 << endl;
	cout << "可以使用C风格的方式对字符串赋值,s2=\"hello,\"" << endl;
	s2 = "hello,";
	cout << "s2:" << s2 << endl;
	cout << "可以使用+号进行字符串的拼接:" << endl;
	s3 = s2 + s1;
	cout << "s3:" << s3 << endl;
	cout << "可以使用+=进行字符串的拼接:" << endl;
	s2 += s1;
	cout << "s2:" << s2 << endl;


	system("pause");
	return 0;
}




你可以把一个字符串赋值给另一个字符串,s2 = s1
s1:小谢 s2:小谢
可以使用C风格的方式对字符串赋值,s2="hello,"
s2:hello,
可以使用+号进行字符串的拼接:
s3:hello,小谢
可以使用+=进行字符串的拼接:
s2:hello,小谢
请按任意键继续. . .


string类中的其它操作
在C++新增string类之前,上面的工作也是需要完成的,为了达到上面的目的程序员使用C语言函数库中的函数来完成。
头文件cstring(string.h)中提供了相应的函数
strcpy():把字符串复制到字符数组当中
strcat():把字符串附加到字符数组的未尾
strlen():获取字符数组的长度,string类中直接使用字符串.size()来获取,返回一个整型长度


在使用字符数组的时候一定要考虑一个问题目标数组的长度,如果太小就会存在无法存储指定信息的危险
string类具有自动调整大小的功能,所以对于string类来说长度这个问题无须太多考虑


C是还提供了strcpy、strcat函数对应的另个版本
strncpy()
strncat()
这两个函数相对于strcpy、strcat需要多提供一个参数来指定目标数组允许的最大长度。虽然这样是安全了,但对于程序的编写更加复杂了


string类I/O


/*
作者:xiesheng
时间:2017-07-02
版本:v1.0
说明:字符串类String
*/


#include <iostream>
#include <string>	//要使用String类,必须要包含这个头文件
#include <cstring>	//为了使用C中的string函数库


int main() {


	using namespace std;


	char charr[20];
	string str;


	cout << "charr在未赋值时的长度:" << strlen(charr) << endl;
	cout << "str在未赋值时的长度:" << str.size() << endl;


	cout << "输入一行文字:\n";
	cin.getline(charr,20);
	cout << "你输入的charr的值是:" << charr << endl;
	cout << "请再输入一行文字:\n";
	getline(cin, str);	//注意:这里cin作为一个参数指定来源,str指定接收的字符串,无须指定长度
	cout << "你输入的str的值是:" << str << endl;


	cout << "----------------现在有值后的长度--------------" << endl;
	cout << "charr在赋值后的长度:" << strlen(charr) << endl;
	cout << "str在赋值后的长度:" << str.size() << endl;




	system("pause");
	return 0;
}




charr在未赋值时的长度:25
str在未赋值时的长度:0
输入一行文字:
hello,world
你输入的charr的值是:hello,world
请再输入一行文字:
hello,world
你输入的str的值是:hello,world
----------------现在有值后的长度--------------
charr在赋值后的长度:11
str在赋值后的长度:11
请按任意键继续. . .


在上面charr在未赋值前长度为什么是25?字符数组长度在定义时最大长度才是20
原因:
1.初始化数组的值未定义
2.strlen()函数是从数组的第一个元素开始计算直到遇到空字符才会结束
3.在未被初始化的字符数组第一个空字符出现的位置是随机的


str的长度是0,原因是在未被初始化的字符串对象被自动初始化为0


其它形式的字符串字面值
wchar_t
char16_t
char32_t
以上种类型在定义字符串字面值的时候分别要加上前缀L,u,U
C++中也支持UTF-8字符编码,它根据编码的数字值,字符可能存储1~4个八位组。
C++中使用前缀u8来表示UTF-8这种字符串字面值


原始字符raw,字符表示的就是自己,比如\n表示的就是两个字符\和n
使用"(、)"作为字符串的定界符,并且使用前缀R来标识原始字符
cout<<R"("小谢,\n,hello,world".)"<<'\n';
上面的显示的结果会是:"小谢,\n,hello,world".


注意:为了在使用原始字符时把)"这个认为是字符而并不是结束,可以在定义字符串的开始结束的界定符时允许做自定义
在"和(之间可以加上字符
比如:
cout<<R"+*("小谢,\n,hello,world")".)+*"<<'\n';
这个时候"+*(是开始,)+*"是结束,因而上面的会打印如下结果:
"小谢,\n,hello,world")".


可以把R与其它的字符串前缀相结合使用,可以在R的前面或后面加上其它字符串的前缀,比如:Ru,UR

猜你喜欢

转载自blog.csdn.net/advent86/article/details/74167411