练习3.1 略
练习 3. 2 编写一段程序从标准输入中一次读入一整行,然后修改程序使其一次读入一个词。
#include <iostream>
#include<string>
using namespace std;
//使用getline一次读入一整行,回车结束
int main()
{
string line;
cout << " please enter your line ,even space" << endl;
while (getline(cin, line)) //循环读取,Ctrl+c结束
cout << line << endl;
return 0;
}
#include <iostream>
#include<string>
using namespace std;
//使用cin一次读入一单词,空白结束
int main()
{
string word;
cout << " please enter your word ,not space" << endl;
while (cin>>word) //循环读取,Ctrl+c结束
cout << word<< endl;
return 0;
}
练习3.3 请说明string类的输入运算符和getline函数是如何分别处理空白字符的
#include<iostream>
#include<string>
using namespace std;
int main()
{
string word, line;
cout << " please select the way to read the string " << endl;
cout << " 1 means read string by word" << endl;
cout << " 2 means read string by line" << endl;
char ch;
cin >> ch;
if (ch == '1')
{
cout << "please enter string : welcome to c++ family " << endl;
cin >> word;
cout << " system read the string is : " << word << endl;
}
else if (ch == '2')
{
cout << "please enter string : welcome to c++ family " << endl;
getline(cin, line);
cout << " system read the string is : " << line << endl;
}
else
{
cout << "input error,please try again" << endl;
}
return 0;
}
练习3.4 编写一段程序读入两个字符窜,比较其是否相等并输出结果。结果不相等,输出较大的那个字符串。改写上述程序,比较输入的两个字符串是否等长,如果不等长,输出长度较大的那个字符串。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string word1, word2;
cout << "please enter two strings " << endl;
cin >> word1 >> word2;
if (word1 == word2)
{
cout << word1 << endl;
}
else if (word1>word2)
{
cout << word1 << endl;
}
else
{
cout << word2 << endl;
}
return 0;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
string word1, word2;
cout << "please enter two strings " << endl;
cin >> word1 >> word2;
auto len1 = word1.size();
auto len2 = word2.size();
if (len1 == len2)
{
cout << word1 << endl;
}
else if (len1>len2)
{
cout << word1 << endl;
}
else
{
cout << word2 << endl;
}
return 0;
}
练习3.5 编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string word,result;
cout << "please enter strings " << endl;
cout << " Ctrl+z indicates that the input is complete" << endl;
while (cin>>word)
{
result += word;
}
cout << result << endl;
return 0;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
string word,result;
char space = ' ';
cout << "please enter strings " << endl;
cout << " Ctrl+z indicates that the input is complete" << endl;
while (cin>>word)
{
word += space;
result += word;
}
cout << result << endl;
return 0;
}
练习3.6 编写一段程序,使用范围for语句将字符串内的所有X替换
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cout << "please enter strings ,even space" << endl;
getline(cin, s); //读取整行,回车结束
//利用auto关键字推断字符串中的每一个元素的类型
//c必须定义为引用类型,否则无法修改字符串内容
for (auto& c : s)
{
c = 'X';
}
cout << s << endl;
return 0;
}
练习3.7 就上一题完成的程序而言,如果将循环控制变量的类型设为char将发生什么?先估计一下结果,然后实际编程进行验证。
#include<iostream>
#include<string>
using namespace std;
//就本题而言,将循环控制变量类型设为char不会对结果造成影响
//因为auto自动推断字符串s的元素类型,结果同样是char
int main()
{
string s;
cout << "please enter strings ,even space" << endl;
getline(cin, s); //读取整行,回车结束
//c必须定义为引用类型,否则无法修改字符串内容
for (char& c : s)
{
c = 'X';
}
cout << s << endl;
return 0;
}
练习3.8 分别用while循环和传统的for循环重写练习3.6的程序,你觉得哪种形式更好?为什么?
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cout << "please enter strings ,even space" << endl;
getline(cin, s);
int i = 0;
while (s[i]!='\0')
{
s[i] = 'X';
i++;
}
cout << s << endl;
return 0;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cout << "please enter strings ,even space" << endl;
getline(cin, s);
for(int i = 0;i<s.size();i++)
{
s[i] = 'X';
}
cout << s << endl;
return 0;
}
练习3.9 下面的程序有何作用?它合法吗?如果不合法,为什么?
#include<iostream>
#include<string>
using namespace std;
//程序愿意是输出字符串s的首字符,但程序是错误的
//因为初始状态下没有给s赋任何初值,所以s的内容为空,当然也就不存在首字符,下标0是非法的
//但在visual studio编译并不会发生编译错误
int main()
{
string s;
cout <<s[0] << endl;
return 0;
}
练习3.10 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string s;
cout << "Please enter a string ,the best contain certain punctuation" << endl;
getline(cin, s);
for (auto& c : s)
{
if (!ispunct(c))
cout << c;
}
cout << endl;
return 0;
}
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string s,result;
cout << "Please enter a string ,the best contain certain punctuation" << endl;
getline(cin, s);
for (decltype(s.size())i = 0; i < s.size(); i++)
{
if (!ispunct(s[i]))
result += s[i];
}
cout << result<<endl;
return 0;
}
练习3.11 下面的范围for语句合法吗?如果合法,c的类型是什么?
#include<iostream>
#include<string>
//s是一个常量字符串,则c的推断类型是常量引用,即c所绑定的对象值不能改变
using namespace std;
int main()
{
const string s = "keep out!";
for (auto&c:s)
{
{
/*...*/}
}
return 0;
}
练习3.12 下列vector对象的定义有不正确的吗?如果有,请指出来。对于正确的,描述其执行结果;对于不正确的,说明其错误的原因。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
//定义了一个名为ivec的vector对象,其中的每个元素都是vector<int>对象
vector<vector<int>> ivec;
//错误,svec的元素类型是string,而ivec的元素类型是int,因此不能使用ivec初始化sevc。
vector<string> svec = ivec;
//定义了一个名为svec的vector对象,其中含有10个元素,每个元素都是字符串null
vector<string> svec(10, "null");
}
练习3.13 下列的vector对象包含多少个元素?这些元素的值分别是多少?
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
// 元素数量为0
vector<int> v1;
//元素数量为10,每一个元素都被初始化为0
vector<int> v2(10);
//元素数量为10,每一个元素都被初始化为42
vector<int> v3(10, 42);
//元素数量为1,元素的值为10
vector<int> v4{
10 };
//元素数量为2,两个元素值为10,42
vector<int> v5{
10, 42 };
//元素数量为10,每一个元素都被初始化为空串
vector<string> v6{
10 };
//元素数量为10,每一个元素都被初始化为hi
vector<string> v7{
10 ,"hi" };
return 0;
}
练习3.14 编写一段程序,用cin读入一组整数并把它们存入一个vector对象
#include<iostream>
#include<vector>
using namespace std;
int main(