首先是while循环代码:
void Menu() {
string option;
char yes;
yes='y';
while (yes == 'y') {
cout << "Commands: buy, sell, directory, and exit: ";
getline (cin, option);
if (option == "buy") {
...
}
...
cout << "Do you wish to continue? Press y for yes, n for no: ";
cin >> yes;
}
}
当循环第二次关闭时(按是),它会跳回到:
cout << "Do you wish to continue? Press y for yes, n for no: ";
我认为这与早期提供getline()的答案有些关系,但我不知道在哪里。
即:
Here is the menu: Commands: buy, sell, directory, and exit: buy
Enter a player's I.D: 2
Here is your current money after purchasing Player X: 150000
Do you wish to continue? Press y for yes, n for no: y
Commands: buy, sell, directory, and exit: Do you wish to continue? Press y for yes, n for no: y
Commands: buy, sell, directory, and exit: Do you wish to continue? Press y for yes, n for no:
目的是在按yes时重复循环(包括能够输入另一个命令)。
答案 0 :(得分:9)
cin >> yes;
就在那里,用户输入一封信,让我们说'y'。然后点击进入。这将在输入缓冲区'y'和'\ n'中存储2个字符。 'y'存储在yes中,但'\ n'仍然存在。当你再次来到这里时:
getline (cin, option);
由于缓冲区中已有换行符,因此getline具有所需的内容,并且无需提示用户。
有一些解决方案。您可以在cin.ignore()
之后添加对cin >> yes
的来电。或者您可以将yes
设为字符串,并使用getline
代替operator>>
。
答案 1 :(得分:0)
这是因为\n
将在第一个cin
之后保留在缓冲区中。您可以通过在两次连续读取之间添加空cin.get()
来解决此问题。只需放一个柜台,然后进行第一次验证:
//(...)
int count = 0;
//(...)
while (yes == 'y')
{
if (count == 0)
{
// "Clear the very first input"
cin.get();
}
cout << "Commands: buy, sell, directory, and exit: ";
getline (cin, option);
if (option == "buy") {
...
}
...
cout << "Do you wish to continue? Press y for yes, n for no: ";
cin >> yes;
// Increment the counter
count++;
}
字体:
答案 2 :(得分:0)
有时cin.Clear()或只是cin.ignore()不起作用。我没有研究过为什么,但我找到了另一个答案。根据我的理解,缓冲区中仍然存在导致此问题的事情。就像其他海报所说的那样...
cin.ignore(cin.rdbuf()->in_avail(),'\n');
将解决问题。在询问第一个问题之后,将这行代码放在第一个getline语句之前。
答案 3 :(得分:0)
问题是cin在getline()调用的流中留下了一个换行符。
尝试添加cin.ignore(1,&#39; \ n&#39;);在cin之后删除该换行符。 :)
答案 4 :(得分:0)
cin.clear()。它对我有用。
答案 5 :(得分:0)
如果要为不同的测试用例获取输入,则此方法有效:在获取测试用例数之后,输入“ cin.ignore()”。示例:-
int main() {
int t;
cin>>t;
cin.ignore(); //putting of ignore function
while(t--)
{
string str;
getline(cin,str);
cout<<str<<"\n";
}
}