C++中的cin, cin.getline, getline等混用时不能输入直接执行下一行的问题与解决办法

在最近写CCF的一道算法题(201903-4)时,遇到了一个有点棘手的问题。当我先使用cin>>,再使用getline(cin,string1)时,会出现getline无法输入的情况,在查询了相关资料后,我解决了这个问题。

首先举一个例子,如下面的代码所示:

 #include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please input a: "; int a; cin >> a;
cout << "a is " << a << endl;
cout << "Please input b: ";
char b[20];
cin.getline(b, 20);
cout << "b is " << b << endl;
cout << "Please input c: ";
string c;
getline(cin, c);
cout << "c is " << c << endl;
return 0;
}

上面这个程序看起来没有任何问题,先输入int类型的a,然后输入char数组b,最后输入string对象c,但是实际运行会是怎样呢?
看下面这个运行结果图就知道了:

还不等你输入b,就会直接将后面的cout语句打印出来,这是为什么呢?

这里其实有很多种情况,首先对于上面这样,先cin>>,再cin.getline()的情况,是因为cin>>会在缓冲区中多出一个回车符,即你输入完之后,敲完回车符之后,cin>>会在缓冲区中再多保留一个回车符,这个多出来的回车符就导致下面cin.getline()执行时,自动读取缓冲区内的回车符,于是这句cin.getline()就相当于你什么都没有敲就执行完了,自然就会去执行下面的语句了。

这种情况的解决方法很简单,在cin>>后面加一句cin.get()就行了,这个cin.get()就会将缓冲区内多出来的回车符消耗掉,于是后面的输入就正常了。

修改后的代码如下所示:

 
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please input a: ";
int a;
cin >> a;
cin.get(); //消耗掉回车
cout << "a is " << a << endl;
cout << "Please input b: ";
char b[20]; cin.getline(b, 20);
cout << "b is " << b << endl;
cout << "Please input c: ";
string c; getline(cin, c);
cout << "c is " << c << endl;
return 0;
}

运行结果如下所示:

可见cin>>在缓冲区多保留一个回车符的情况,对于后面接cin.getline()函数和getline()函数都会有影响,当然,我们这里在cin>>后面加上cin.get()函数肯定也是可以解决问题的。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注