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

My while loops seems to be ignoring my getline

本文关键字:我的 getline while 循环      更新时间:2023-10-16

以下是的所有代码

#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 somethingn:";
        string str;
        str.clear();
        getline(cin,str);
        Pdelay(str);
        cout << "nn[1]Type something again"<< endl;
        cout << "[2]Exitn:";
        cin >> exit;
    }
    return 0;
}

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

使用cin后,换行符立即保留在缓冲区中,并被随后的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 somethingn:";
        std::string str;
        str.clear();
        std::getline(std::cin, str);
        Pdelay(str);
        std::cout << "nn[1]Type something again" << std::endl;
        std::cout << "[2]Exitn:";
        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');
    }
}

我刚刚意识到这个问题以前也被问过(以稍微修改的形式),答案很好:

为什么std::getline()在格式化提取后跳过输入?