Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取或不获取用户输入_C++ - Fatal编程技术网

C++ 获取或不获取用户输入

C++ 获取或不获取用户输入,c++,C++,我的代码有问题。实际上,它工作得很完美,我只是在寻找更好的解决方案。我所做的是这样的,它只是整体的一部分,不需要发布其他部分,因为这里只需要它: #include <windows.h> int main(){ int a = 0, int b = 3; while(true) { a = a * a + b; Wait(1000); } return 0; } 我想要实现的是随时更改变量b的能力。到目前为止,我找到

我的代码有问题。实际上,它工作得很完美,我只是在寻找更好的解决方案。我所做的是这样的,它只是整体的一部分,不需要发布其他部分,因为这里只需要它:

#include <windows.h>

int main(){
    int a = 0, int b = 3;
    while(true) {
        a = a * a + b;
        Wait(1000);
    }
    return 0;
}

我想要实现的是随时更改变量b的能力。到目前为止,我找到的最好的解决方案是使用getche,因为它不需要每次都按enter键,但我仍然必须每次都放一些东西。完美的解决方案是:如果用户想要更改b,他会输入一个新值,只要输入一个数字,否则循环就会继续。有什么想法吗?我将感谢任何帮助

也许是这样的?我还没有测试过这个

#include <thread>
#include <iostream>

using namespace std;
bool loop;
int a = 0, b = 0;
void multiplication () {
    while(loop) {
        a += b;
        b = 0;
        // wait(1000);
        cout << "a = " << a << endl;
    }
}

int main () {
   loop = true;
   thread myThread(multiplication);
   while(b != -1) {
       cin >> b;
   }
   loop = false;
   cout << "done!" << endl;
}

C++标准库不定义非阻塞读函数。您可以创建一个读线程,该线程阻止读取并设置一个正确同步的变量,该变量是从另一个执行计算的线程读取的。不过,我不会追求这个方向

相反,我将使用一些特定于平台的设置将std::cin设置为非阻塞。在UNIX上,您可以使用fcntl将标准输入流置于非阻塞输入模式:

int flags = fcntl(0, F_GETFL);
fcntl(0, F_SETFL, flags | O_NONBLOCK);

unsigned long count(0);
for (char value(0); !(std::cin >> value) || value != '1'; ) {
    std::cin.clear();
    ++count;
}
std::cout << count << '\n';

如果你使用C++,我会推荐WITRILL,而不是WIL1,以获得更好的可达性。是的,你说得对。在原始代码中,这是真的,我在这里放了1,因为。。不知道为什么:P但是谢谢你!不知道如何解决这个问题?所以当他执行while循环时,你的程序冻结了?我认为你需要使用线程。你说的是getche,但还没有在你的代码中使用它?它一直在做乘法,但效果是冻结的,是的。我没有使用getche,因为它不是我想要的代码。有了getche,我必须在每一份文件中加入一些东西,并希望它是可选的。@martijnn2008,哈?您需要解释这种更好的可访问性注意,这个程序有未定义的行为:一个对象在一个线程中写入,并在另一个线程中访问,即在没有同步的情况下读取或写入,会创建数据竞争。每个数据竞争都会导致未定义的行为。好的,你提到过,但我希望@user3670601可以说,如果他想朝这个方向走,可能会完成代码。nvm,这可能是我正在寻找的Hanks martijnn2008,这正是我需要的;非常感谢你的帮助!