getline()在while循环中第二次不工作

时间:2011-12-31 05:05:48

标签: c++ while-loop

首先是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时重复循环(包括能够输入另一个命令)。

6 个答案:

答案 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++;
}

字体:

Can't get char from cin.get()

http://www.cplusplus.com/reference/istream/istream/get/

答案 2 :(得分:0)

有时cin.Clear()或只是cin.ignore()不起作用。我没有研究过为什么,但我找到了另一个答案。根据我的理解,缓冲区中仍然存在导致此问题的事情。就像其他海报所说的那样...

cin.ignore(cin.rdbuf()->in_avail(),'\n');

将解决问题。在询问第一个问题之后,将这行代码放在第一个getline语句之前。

http://www.cplusplus.com/forum/beginner/20206/

答案 3 :(得分:0)

问题是cin在getline()调用的流中留下了一个换行符。

尝试添加cin.ignore(1,&#39; \ n&#39;);在cin之后删除该换行符。 :)

答案 4 :(得分:0)

getp之后的

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";
    }
}