a; st-6ren">
gpt4 book ai didi

c++ - 清除终端的额外输入

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:30 26 4
gpt4 key购买 nike

这是演示我面临的问题的示例代码。

#include <iostream>
#include <string>
extern "C" {
#include <unistd.h>
}

int main()
{
std::cout << "Making tests ready!" << std::endl;
std::cout << "\nTo start out, Enter an integer: ";
int a = 0;
std::cin >> a;
std::string input;
sleep(3); // what to do if user enters data during this?
std::cout << "\n Now enter a string";
std::getline(std::cin, input);
std::cout << "\nHere are your values - " << a << " & " << input;
return 0;
}

看到代码之间的 sleep 调用了吗?当我的程序不接受任何输入时,在计算某些东西时,这可以用较长的延迟来代替。现在,如果用户在此期间按下某些键,该输入将被 std::getline() 捕获在下一行代码中。我知道这是默认行为,因为它应该捕获所提供的输入。

但我想要的是清除所有捕获的输入并从第 15 行重新开始,即 std::cout << "\n Now enter a string"; ,这是 sleep 后立即。我不知道描述这个的确切术语,否则我会使用那个。谢谢。

编辑:我试过使用 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');在我的代码中,但它要求输入然后丢弃它。


请注意我的英文不是母语。

最佳答案

阅读评论让我认为你无法真正解决这个问题(至少通过那里建议的方法)。在任何情况下都存在固有的竞争条件。考虑以下几行:

sleep(3);       
// (*) <- Potential location 1.
std::cout << "\n Now enter a string";
// (**) <- Potential location 2.
std::getline(std::cin, input);

各种评论显示了一些(非常有技术能力的)刷新标准输入的方法。问题是,您不能将它们放在标记为 (*) 的位置。也不(**) .

  • 第一个位置 - 您可以通过某种方式清除标准输入。现在您决定是时候移至下一行 ( std::cout << ... )。当您这样做时,用户会输入更多的内容。比赛!

  • 第二个位置 - 您打印出消息 (std::cout << ...),然后继续清除标准输入。在你设法做到这一点之前,用户输入了一些东西。比赛!


在我看来,评论中描述的任何技术都需要锁定标准输入,而且我认为没有(标准)方法可以做到这一点。

关于c++ - 清除终端的额外输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com