输入被跳过。这是一个如此简单的程序,但我不明白为什么它会跳过这个。
#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 string
enter。然后将12
读取为repeat
的值,并将some string
读取为字符串,然后将其打印回12次。
这个问题存在是因为cin
和getline
的行为。
当你读取第一个数字时,输入流看起来像这样:
before cin:
2n
^
after cin:
2n
^
cin
只读取所需的数字,然后插入符号指向n
符号。
所以getline
默认从当前插入符号位置读取到n
,在这个例子中它读取一个空字符串。所以你需要阅读这n
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? ";
cin.get() // get 'n' symbol
getline(cin, message);
for(int i=0;i<repeat;i++)
{
cout<<message<<endl;
}
}