簡體   English   中英

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

[英]My while loops seems to be ignoring my getline

這是所有代碼

#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語句。

使用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 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');
    }
}

我剛剛意識到,以前曾有人問過這個問題(形式稍有修改),答案很好:

為什么std :: getline()在格式化提取后會跳過輸入?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM