我的while循环似乎忽略了我的getline

时间:2016-01-08 01:49:19

标签: c++ c++11

这是所有代码

#include <iostream>
#include <string>
#include <windows.h>
#include <stdlib.h>
using namespace std;

void Pdelay(string str)
{
    for (char c : str)
    {
        std::cout << "" << c << "";
        Sleep(100);
    }
    std::cout << '\n';
}


int main()
{
    int exit = 1;
    while (exit == 1)
    {

        cout<< "Type something\n:";
        string str;
        str.clear();
        getline(cin,str);
        Pdelay(str);

        cout << "\n\n[1]Type something again"<< endl;
        cout << "[2]Exit\n:";

        cin >> exit;
    }
    return 0;
}

每当我运行它时,它在第一次循环时正常工作,当它循环回来时它会跳过getline并继续使用两个cout语句。

1 个答案:

答案 0 :(得分:4)

使用cin后,换行符会立即保留在缓冲区中并且正在被“吃掉”#34;随后的getline。您需要清除该额外换行符的缓冲区:

// immediately after cin (need to #include <limits>)
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');

这就是为什么将std::cinstd::getline结合起来并不是一个好主意。顺便说一句,您可以在完全符合标准的C ++ 11中编写代码,而不需要额外的非库标题:

#include <chrono>
#include <iostream>
#include <limits>
#include <string>
#include <thread>

void Pdelay(std::string str)
{
    for (char c : str)
    {
        std::cout << "" << c << "" << std::flush;
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    std::cout << '\n';
}

int main()
{
    int ext = 1;
    while (ext == 1)
    {
        std::cout << "Type something\n:";
        std::string str;
        str.clear();

        std::getline(std::cin, str);
        Pdelay(str);

        std::cout << "\n\n[1]Type something again" << std::endl;
        std::cout << "[2]Exit\n:";

        std::cin >> ext;
        if(!std::cin) // extraction failed
        {
            std::cin.clear(); // clear the stream
            ext = 1;
        }
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
}

我刚才意识到之前已经问过这个问题(稍加修改过),答案很棒:

Why does std::getline() skip input after a formatted extraction?