程序跳过getline



输入被跳过。这是一个如此简单的程序,但我不明白为什么它会跳过这个。

#include <iostream>
#include <string>
using namespace std;
int main()
{
int repeat;
string message;
cout<<"Computer Punishment"<<endl;
cout<<"-----------------------"<<endl;
cout<<"Repititions? ";
cin>>repeat;
cout<<"Message? ";
getline(cin, message);
for(int i=0;i<repeat;i++)
{
cout<<message<<endl;
}
}
int repeat;
[ ...]
cin>>repeat;
[...]
getline(cin, message);

输入repeat的值时,按enter键。然后你(可能)输入得到的数字阅读repeat的值。但是您输入的新行仍然在输入缓冲区中。

然后,当你调用getline时,它会查看输入缓冲区,并读取数据,直到它找到一个新行,此时它停止并返回它在新行之前找到的所有数据——(在这种情况下)可能什么都没有,所以你将读取一个空字符串。

要测试这是实际发生的情况,当它要求重复计数时,您可以输入如下内容:12 some stringenter。然后将12读取为repeat的值,并将some string读取为字符串,然后将其打印回12次。

这个问题存在是因为cingetline的行为。

当你读取第一个数字时,输入流看起来像这样:

before cin:
2n
^
after cin:
2n
^

cin只读取所需的数字,然后插入符号指向n符号。

所以getline默认从当前插入符号位置读取到n,在这个例子中它读取一个空字符串。所以你需要阅读这ngetline之前(这是唯一的解决方案),然后您的代码将工作:

#include <iostream>
#include <string>
using namespace std;
int main()
{
int repeat;
string message;
cout<<"Computer Punishment"<<endl;
cout<<"-----------------------"<<endl;
cout<<"Repititions? ";
cin>>repeat;
cout<<"Message? ";

cin.get() // get 'n' symbol

getline(cin, message);
for(int i=0;i<repeat;i++)
{
cout<<message<<endl;
}
}

最新更新