【问题标题】:Stopping while-loop with std::cin input使用 std::cin 输入停止 while 循环
【发布时间】:2015-03-18 14:00:18
【问题描述】:

我目前正在尝试创建一个只有在用户输入“退出”、“退出”或类似内容时才应停止的循环。我已经尝试了一些变体,但我需要它来执行循环的其余部分,而不是停下来等待输入。

Running = true;
while(Running)
  {
    char c;
    std::cout << "test ";
    c = std::cin.peek(); 
    if(c=='Q'|| c=='q')
    {
    Running = false;
    }
  }

任何帮助将不胜感激。

【问题讨论】:

  • 您可能打算写c = std::cin.peek(); 另外您应该告诉我们该代码还有什么问题。
  • 是的,我做到了。它打印一次“测试”。如果我按回车,我将无法停止循环。如果我在第一次“测试”之后输入“退出”,它就会起作用。我希望它无休止地打印“测试”,直到我输入“退出”。对不起,如果我不够清楚。
  • 或许这值得一读:stackoverflow.com/questions/3317740/…

标签: c++ while-loop cin


【解决方案1】:

除了peek() 返回int_type,而不是char...

...它 reads the next character from the stream without actually extracting it.

由于您的cin 在这一点上确实不包含任何内容(除非您将某些内容通过管道传输到您的程序,或者已经输入了某些内容),调用将阻塞直到一个字符被peek()ed。

由于使用&lt;iostream&gt;,您的程序实际上并没有接收输入直到您按下Enter,这就是您的程序所做的:等到你输入了一些东西,然后按下 Enter

只有然后程序会检查您输入的第一个字符是“q”还是“Q”。您输入的,包括第一个字符,将保留在流中——所以下次你peek()时,它仍然是同一个字符。

解决方案? C++ 标准库中没有cin 的非阻塞查询。您要么必须使用线程,要么参考一些第三方输入处理(例如 Microsoft Windows 或 NCurses 库提供的 getch() 函数)。

【讨论】:

  • @volerag:该死,他们从 C64 开始就更改了血腥钥匙的标签?告诉你我有多久没有停止寻找了。 :-D
【解决方案2】:

简单地这样做。

std::string input;
cin>>input;
while(input!="quit" && input!="Quit")
{
// do something;
// get input.
}

【讨论】:

    【解决方案3】:

    不知道你的意思是什么

    我需要它来执行循环的其余部分,而不是停下来等待输入。

    但是如果你把c=std::cin.peek()替换成std::cin &gt;&gt; c,就会解决死循环问题。

    Running = true;
    while (Running)
    {
        char c; 
        std::cin >> c;
        std::cout << "test";
    
        if (c == 'Q' || c == 'q')
        {
            Running = false;
        }
    }
    

    【讨论】:

    • 如果没有输入,我希望循环继续,但如果有“退出”则停止。我想我正在寻找某种中断的东西?
    • 定义“退出”,因为我仍然不确定。也许循环一直持续到计数为 10,100...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多