繁体   English   中英

std::cin 和 std:.getline 的问题

[英]Problems with std::cin and std:.getline

你好[抱歉我的英语不好],

我在 C++ 中用 winsock 编写了一个小网卡游戏(控制台应用程序)。 基本上程序执行以下方式:

1) Open Socket and wait for a peer to connect
2) If connected -> start game
3) If its your turn -> decide which action should be taken next and type it in
3.1) If its not your turn -> wait for your peers decision

当用户在等待时,他们可以在控制台中输入一些东西(实际上在输入时不会打印出来)。 如果轮到用户,则可能出现三种结果:

1) The user inputs only valid data -> program runs fine
2) The user inputs trash while waiting but doesnt press enter (no \n)
3) The user inputs trash while waiting and does press enter (\n)

在情况 2) 和 3) 中,我有一个大问题:因为输入缓冲区中似乎还有一些输入,所以我对 std::getline 的调用(以获取用户输入)会占用用户之前输入的垃圾。

示例:我启动程序并等待另一个用户加入我的游戏。 在等待时,我在控制台中输入“abc”并按 Enter。 另一个用户加入了游戏。 在一些设置工作之后,程序应该接受我的输入,以便我可以决定下一步要做什么。 但这不会发生。 首先'abc'被打印在屏幕上,其次程序不等待我的输入,因为它使用'abc'作为std::getline调用的输入。

这是重现我的“问题”的代码示例:

int main()
{
    std::string str;
    std::cout << "Before sleep";
    std::this_thread::sleep_for(5s);

    std::cin.ignore(std::numeric_limits<std::streamsize>::max());
    std::cin.clear();

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

我用 this_thread::sleep_for(5s) 模拟了“等待”。 在等待期间,您可以输入垃圾,并根据您的输入在 5 秒后打印并等待更多输入,或者如果您不使用 std::cin.ignore 和 std::cin.clear 则结束程序。

std::ignore() 和 std::clear 似乎不像我认为的那样工作(清除输入缓冲区并重置 std::cin 状态标志)

我的问题:

1)如何在获取用户输入之前清空输入缓冲区?

2)为什么控制台打印我的输入?

使用“std::cin.ignore(std::numeric_limits::max(),'\n');” 在“cin”语句之后丢弃输入 stream 中的所有内容,包括换行符。

这是我的代码:

int main()
{
    std::string str;
    std::cout << "Before sleep\n";

    ……//Simulate wait time

    std::string str1;
    std::cin >> str1;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');  
    std::getline(std::cin, str);
    std::cout << str;
}

我在等待时间输入“ASD”,等待时间过去后打印“ASD”。 然后我继续输入字符,只有后面输入的output字符。

编辑:如果你想实现在等待时间内输入的垃圾不会出现在控制台上? 如果是这样,我建议您可以尝试运行代码:

#include <iostream>
#include <chrono>
#include <thread>
#include<string>
#include <limits>
#include<stdio.h>
#include<windows.h>
#include <WinBase.h>

using namespace std::chrono_literals;

int main()
{
    std::string str;
    std::cout << "Before sleep\n";
    std::this_thread::sleep_for(5s);
    std::getline(std::cin, str);



    int i;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    COORD pos = { 0,1 };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    for (i = 1; i <= 10; i++)
        std::cout << ' ';
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);


    std::cin.get();
    std::cin.clear();  // Reset all state values in the stream to valid values
    std::cin.sync();   //Empty stream

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM