继续运行程序而无需任何干预,直到要求退出

时间:2018-08-09 05:52:05

标签: c++ loops c++11

下面的代码期望用户在每个循环中键入一个字符。如果我要继续运行此循环,而用户不必在每个循环中输入任何字符,直到输入数字0,我该如何实现。

#include<iostream>

int main()
{
    int i = 1;
    int ch = 1;
    while (ch != 0)
    {
        std::cin >> ch;
        std::cout << "Hi" << i << std::endl;
        ++i;
    }
    return 1;
}

2 个答案:

答案 0 :(得分:3)

线程化是您唯一的可能性。当您使用std :: cin时,也总是需要ENTER键。这可能有效:

#include <future>
#include <iostream>
#include <thread>

int main(int argc, char** argv) {
    int i = 1;
    std::atomic_int ch{1};
    std::atomic_bool readKeyboard{true};

    std::thread t([&ch, &readKeyboard]() {
        while (readKeyboard) {
            int input;
            if (std::cin >> input) {
                ch = input;
                if (ch == '0') {
                    break;
                }
            }
        }
    });

    while (ch != '0') {
        std::cout << "Hi" << i << std::endl;
        ++i;
    }

    readKeyboard = false;
    t.join();
    return 1;
}

答案 1 :(得分:1)

您可以执行此操作,但必须使用线程。这是如何实现此行为的最小示例。请注意,您至少需要C ++ 11。

#include <iostream>
#include <thread>
#include <atomic>

int main() 
{
    std::atomic<bool> stopLoop;

    std::thread t([&]() 
    { 
        while (!stopLoop) 
        { 
            std::cout << "Hi"; 
        }

    });

    while (std::cin.get() != '0') //you will need to press enter after pressing '0'
    {
        ; //empty loop, just wait until there is 0 on input
    }
    stopLoop = true; //this stops the other loop
}

其他选择是进入特定于操作系统的库。现在,您必须确保C ++在标准库中没有任何类型的非阻塞I / O,并且大多数时候您必须按<ENTER>才能在输入流(std :: cin)中输入任何内容