练习3.22
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> s;
string t;
while (cin >> t)//回车时并代表输入了一个空字符串,详见解析!
s.push_back(t);
for (auto i = s.begin(); i != s.end() && !i->empty(); ++i)
{
for (auto i2 = i->begin(); i2 != i->end(); ++i2)
*i2 = toupper(*i2);
cout <<*i<< endl;
}
cout << endl;
system("pause");
return 0;
}
结果现象 是这样的:
即我们设想的结果应该是只有hello,world!变为大写,并且输出。但是实际结果是两行都输出了,那么中间的两个回车空格去哪了呢?不应该是空字符串么?对于这个问题,我们可以写一个小的测试:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> s;
string t;
while (cin >> t)
s.push_back(t);//即回车时,就会产生一个空串。
for (auto n : s)
cout << n<<endl;
cout << endl;
system("pause");
return 0;
}
将vector对象s中,放入几个元素(字符串),在用范围for去遍历他。并且每一个元素输出后都要输出endl。那么我们这样输入:
即我们认为我们输入了,三个元素,分别是字符串1:"hello,world!", 字符串2:空字符串,字符串3:"nihao,shijie!"。
那么输出应该是:hello,world!
(endl)
nihao,shijie!
但是实际结果是没有中间的endl,也就是说,在用cin输入元素中,如果输入“回车”,那么这个回车并不是代表了输入空字符串而存入vector。结果就是实际上就有两个元素,故输出两行!
那么我们可以对原有程序做出修改:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> s;
string t;
while (getline(cin,t))
s.push_back(t);//即回车时,就会产生一个空串。
for (auto i = s.begin(); i != s.end() && !i->empty(); ++i)
{
for (auto i2 = i->begin(); i2 != i->end(); ++i2)
*i2 = toupper(*i2);
cout << *i << endl;
}
cout << endl;
system("pause");
return 0;
}
结果现象:
即我们用getline这个函数,当我们输入“回车”时,得到的是一个空字符串!
并且我们可以继续做同样的测试:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> s;
string t;
while (getline(cin,t))
s.push_back(t);//即回车时,就会产生一个空串。
for (auto n : s)
cout << n << endl;
cout << endl;
system("pause");
return 0;
}
得到的现象:
所以得到的结果表明,我们用getline函数时,是可以当我们输入的是“回车”时,得到的是一个空字符串,并且可以存到vector中去的。
结论:当我们想用“回车”来得到一个空字符串时,不能用cin,cin会忽略这个回车。而是用getline这个函数,是可以实现效果的!
(如有问题,欢迎大家指正!)
练习3.23
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int>num;
int n;
while (cin >> n)
num.push_back(n);
for (auto i = num.begin(); i != num.end(); ++i)
{
(*i) *= 2;
cout << *i << endl;
}
cout << endl;
system("pause");
return 0;
}