为什么使用cin>>之后使用getline(cin,str)会直接跳过第二次输入?

我们知道cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组(字符串)输入时只读取一个单词(当输入的多个单词以空格分隔时)。

string str;
cin >> str;
cout << str << endl;

运行如下图:

此时str中只保存了第一个单词Hello。

当我们想要将多个单词存储在同一个字符数组(字符串)中时,可以使用getline(cin,str)来实现。

string str;
getline(cin, str);
cout << str << endl;

运行如下图:

问题:

当我们先使用cin>>读取输入内容后再使用getline(cin,str)来读取字符串,则会遇到直接跳过后者读取操作的情况。假设我们现在需要先输入一个人的id和姓名并换行输出。

	int id;
	string name;
	cin >> id;
	getline(cin, name);
	cout << "id: " << id << endl;
	cout << "name: " << name << endl;

 运行如下图:

可以看到,我们还没输入name的值就直接跳到输出代码了。

原因:

当使用cin>>读取字符串时,运算符会直接忽略第一次遇到的空白(空格、制表符和换行符)读取字符直到读取到下一次的空白并且将遇到的空白保留在输入序列中。而getline()方法会读取整行的数据(包括空格、制表符和换行符),并且用回车键输入的换行符来确定输入结尾,然后将换行符丢弃。因此,当我们先使用cin>>读取了一个人的id后,输入序列中留下了换行符;当使用getline()方法时,会先读取到换行符并判断已经到输入结尾了,所以字符串name中没有任何数据。

解决方法1:

在第一次输入后使用C++标准输入流中的一个方法——cin.ignore(a,ch)。它表示从输入流 cin 中提取字符,提取的字符被忽略,不被使用。而每抛弃一个字符,它都要进行计数和比较字符:如果计数值达到 a 或者被抛弃的字符是 ch ,则cin.ignore() 函数执行终止;否则,它继续等待。如果不设置参数,则把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束(a的默认值为1,ch的默认值为EOF)。

详细用法参考:cin.ignore()的用法

int id;
string name;
cin >> id;
cin.ignore();
getline(cin, name);
cout << "id: " << id << endl;
cout << "name: " << name << endl;

运行如下图:

解决方法2:

在第一次输入后使用不带任何参数的cin.get()方法,它可以直接读取下一个字符(即使是换行符)。

int id;
string name;
cin >> id;
cin.get();
getline(cin, name);
cout << "id: " << id << endl;
cout << "name: " << name << endl;

运行如下图:

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值