C++ primer 5 3.4.1节练习(cin和getline对于“回车”的处理)

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




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值