标准库类型sring

1、string 类型表示可变长的字符序列,需要包含头文件 include

2、定义和初始化 string 对象

标准库类型sring_第1张图片
拷贝初始化:使用了“=”号
直接初始化:用“()”。

3、string 对象的操作

标准库类型sring_第2张图片
cin << string; //会忽略前面的空白的无效字符,最后遇到空格会停止输入。

4、使用getline读取一整行

有时我们希望能在最终得到的字符串屮保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去**(注意不存换行符)**getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是换行符,那么所得的结果是个空string。

练习3·2:编写一段程序从标准输入中一次读入一整行,然后修改该程序使其一次读入

#include 
#include 
#include 
using namespace std;

int main()
{
	string wold;
//	while (cin >> wold) {			//读入一个单词
	while (getline(cin ,wold)) {	//读入一行
		cout << wold << endl;
	}

	return 0;
}

练习3.3:请说明string类的输入运算符和getline函数分别是如何处理空自字符的。
输入运算符cin:会忽略string对象前面的空格,当输入有效字符后,再输入空格,判断输入结束。
getline函数:会将输入的空格存入string对象,遇到换行符结束,换行符不存入string中。

练习3.4:编与一段程序读入两个字符串,比较其是否相等并输出结果。如果不相等,输出较大的那个字符串·改写上述程序,比较输入的两个字符串是否等长,如果不等长,输出长度较大的那个字符串。

#include 
#include 
#include 
using namespace std;

int main()
{
	string s1, s2;
	cout << "请输入s1 、s2 :" << endl;
	cin >> s1 >> s2;
	if (s1 > s2) {
		cout << s1 << "较大" << endl;
	}
	else if (s1 < s2) {
		cout << s2 << "较大" << endl;
	}
	else {
		cout << s1 << "与" << s2 << "相等" << endl;
	}

	if (s1.size() > s2.size()) {
		cout << s1 << "较长" << endl;
	}
	else if (s1.size() < s2.size()) {
		cout << s2 << "较长" << endl;
	}
	else {
		cout << s1 << "与" << s2 << "等长" << endl;
	}

	return 0;
}

练习3.5:编与一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分开来。

#include 
#include 
#include 
using namespace std;

int main()
{
	string s1,s2,s3;
	while (cin >> s1) {
		s2 += s1;	
	}
	cout << s2 << endl;
	fflush(stdin);
	cin.clear();
	cout << "请输入带空格的字符串" << endl;
	getline(cin, s3);
	cout << s3 << endl;
	return 0;
}

5、string 对象中字符的处理

标准库类型sring_第3张图片

6、可以使用索引(下标)来修改string字符串

需要特别注意下标的合法性!
标准库类型sring_第4张图片
练习3.6;编写一段程序,使用范围for语句将字符串内的所有字符用×代替。

#include 
#include 
#include 
using namespace std;

int main()
{
	string str("hello world");
	for (auto &c : str) {
		c = 'X';
	}
	cout << str << endl;
	return 0;
}

练习3.7:就上一题完成的程序而言,如果将循坏控制变量的类型设为char将发生什么?先估计一下结果,然后实际编程进行验证。
结果和上述相同。

练习3.8:分别用while循环和传统的for循环重写第一题的程序,你觉得哪种形式更好呢?为什么?

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	string str("hello world");
	if (!str.empty()) {
		for (int i=0; i < str.size(); i++) {
			str[i] = 'X';
		}
	}
	cout << str << endl;

	str = "hello world";
	int i = 0;
	while(i < str.size()) {
		str[i] = 'X';
		i++;
	}
	cout << str << endl;
	return 0;
}

范围for形式上更简洁一点。

练习3。9 下面的程序有何作用?它合法吗?如果不合法,为什么?

	string str;
	cout << str[0] << endl;

上述程序定义了一个字符串对象 str,但是没有初始化,故执行默认初始化为一个空字符串。然后使用cout输出流打印str[0],由于str是空字符串,因此程序运行的结果是未知的。故它不合法,使用下标运算符时必须要检验其合法性,否则会造成不可预料的后果。

练习3.10:编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。

#include 
#include 
#include 
using namespace std;

int main()
{
	string str("hello world!!!how are you!I find thank you.");
	string str2;
	for (auto& c : str) {
		if (ispunct(c)) {
			continue;
		}
		str2 += c;
	}
	cout << str2 << endl;
	

	return 0;
}

练习3.11:下的范围for语句合法吗?如果合法,c的类型是什么?

	const string s = "Keep out!";
	for (auto& c : s) {
		......;
	}

当for循环中尝试去修改s的值时,不合法,s是常量,不能去修改她的值。
如果只是去读取s的值,则是合法的,此时auto为unsigned char。

你可能感兴趣的:(C++,primer,学习)