Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ getch()不响应停止循环_C++_Linux_Loops_Getch - Fatal编程技术网

C++ getch()不响应停止循环

C++ getch()不响应停止循环,c++,linux,loops,getch,C++,Linux,Loops,Getch,假设ncurses标头在那里,并且我的随机数\u生成器()方法正在工作。我试图通过点击“a”退出循环(最终我想通过点击CTRL退出) 我的代码继续按预期每秒打印随机数。如果满足以下任一条件,我希望它退出: 如果随机数是除数的倍数,它将退出 如果我使用getch(),它将退出。我认为这应该是可行的,但当我击中a时,它不会退出 intmain(intargc,char*argv[]){ int lower=atoi(argv[1]); int-highest=atoi(argv[2]); 整数除数=

假设ncurses标头在那里,并且我的
随机数\u生成器()
方法正在工作。我试图通过点击“a”退出循环(最终我想通过点击CTRL退出)

我的代码继续按预期每秒打印随机数。如果满足以下任一条件,我希望它退出:

  • 如果随机数是除数的倍数,它将退出

  • 如果我使用
    getch()
    ,它将退出。我认为这应该是可行的,但当我击中a时,它不会退出

    intmain(intargc,char*argv[]){
    int lower=atoi(argv[1]);
    int-highest=atoi(argv[2]);
    整数除数=atoi(argv[3]);
    int随机数;
    srand((未签名)时间(0));
    INTC;
    做
    {
    随机数=随机数发生器(最低、最高);
    
    cout因为
    随机数%除数!=0
    是真的,所以它不在乎你输入什么

    如果第一个表达式为真,第二个表达式不执行,则由于逻辑or运算符的行为,请改用
    &&

        random_number % divisor != 0  ||  (c=getch())!=49
     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      ^
           True                           not get executes       
    

    无论何时使用条件,请确保所有部件均按预期运行

    为了更清楚,您应该更好地使用:

    do
        {
            random_number = random_number_generator(lowest, highest);
            cout << random_number << endl;
            sleep(1);
        } while(random_number % divisor != 0 && (c=getch())!='a');
    
    do
    {
    随机数=随机数发生器(最低、最高);
    
    coutwhile循环有一个OR运算符(| |),有两个条件,在这种情况下,求值是从左到右执行的。有两种情况下,条件可以为真,一种是如果随机数%除数==0,另一种是c=getch()==49,如果这些条件中的任何一个为真,则循环将终止,否则将执行下一次迭代

    由于条件求值是从左到右执行的,因此如果while()中的第一个条件为true,则执行下一次迭代,因此每当随机数%divisior==0时,将执行下一次迭代


    解决方案:将c=getch()!=49放在左侧,将其作为第一个条件,并将随机数%除数!=0放在右侧,将其从左到右作为第二个条件。

    因为在任何给定的输入中,至少满足on条件,或者(| |)继续循环。使用and(&&&)相反。

    将您的操作
    | |更改为&
    ,并使
    c=getch()!=49
    成为第一个控件

    int lowest = atoi(argv[1]);
    int highest = atoi(argv[2]);
    int divisor = atoi(argv[3]);
    
    int random_number;
    srand((unsigned)time(0));
    
    int c;
    do
    {
        random_number = random_number_generator(lowest, highest);
        cout << random_number << endl;
        sleep(1);
    } while((c=getch())!=49 && random_number % divisor != 0);
    
    return 0;
    
    int-lowest=atoi(argv[1]);
    int-highest=atoi(argv[2]);
    整数除数=atoi(argv[3]);
    int随机数;
    srand((未签名)时间(0));
    INTC;
    做
    {
    随机数=随机数发生器(最低、最高);
    cout
    charc;
    做
    {
    随机数=随机数发生器(最低、最高);
    不能包含
    #包括
    int main(int argc,char*argv[])
    {
    int lower=atoi(argv[1]);
    int-highest=atoi(argv[2]);
    整数除数=atoi(argv[3]);
    int随机数;
    srand((未签名)时间(0));
    字符c;
    做
    {
    随机数=随机数发生器(最低、最高);
    printf(“%d\n”,随机数);
    if(随机数%除数==0)
    打破
    else if(kbhit()){
    c=getch();
    如果(c=='a')
    打破
    }
    其他的
    睡眠(1);
    }而(1),;
    返回0;
    }
    

    由于
    | |
    的短路行为,这不起作用。我尝试了它,但它仍然像预期的那样,在不退出的情况下打印。我相信所有条件都是首先计算的,并作为一个整体确定为真或假。//尝试这个do{random_number=random_number_生成器(最低、最高);我是否可以尝试四处移动变量(包括此变量)。没有任何效果。您的代码中存在缺陷,因为初始化在do while循环中。因此,外部的while条件没有读取“c”的源。我尝试使用&&但它仍然在不退出的情况下打印。请参阅原始帖子的编辑。此时,我的代码处于此状态片刻。我相信这是最明智的,但它仍然不起作用。我的代码在找到倍数时仍会退出循环,但在我点击“a”时不会退出循环。让你的第二个控件像;(random_number%divisior!=0)一样有趣。它仍然不起作用。也许我缺少了使用getch()的一个小细节。在我的情况下,else if正在等待我的输入。打印第一个随机数后不会发生任何事情。在我点击“a”后,它将继续打印。再次,当找到倍数时,它将退出。我尝试使用&&但它会按上面的编辑所示输出。当找到倍数时,它将退出,但当我点击“a”时它不会退出。因为&&还支持短路@MarcoLau你想总是调用
    getch()
    吗?从全局来看,如果找到一个倍数或者我点击了“a”,我希望循环退出,尽管最终我想点击“Ctrl-E”退出。@MarcoLau不确定,试试这个
    (c=getch())!=49&(随机数%divisior!=0)
    我认为Linux不可用。您使用的是windows机器吗?我会试一试,看看结果。如果我使用的是windows,它将继续执行,直到按下“a”键或randomnumber=0kbH,它在Linux上不可用。我尝试实现头文件并使用了
    #包括“kbhit.h”
    。由于编译错误,
    main,我无法运行它。cpp:50:20:error:“kbhit”未在此范围内声明
    我首先尝试使用您的代码执行此操作。我仍在寻找解决此问题的方法,但我认为这是一条死胡同。包括kbhit.h和kbhit.c
    do
        {
            random_number = random_number_generator(lowest, highest);
            cout << random_number << endl;
            sleep(1);
        } while(random_number % divisor != 0 && (c=getch())!='a');
    
    int lowest = atoi(argv[1]);
    int highest = atoi(argv[2]);
    int divisor = atoi(argv[3]);
    
    int random_number;
    srand((unsigned)time(0));
    
    int c;
    do
    {
        random_number = random_number_generator(lowest, highest);
        cout << random_number << endl;
        sleep(1);
    } while((c=getch())!=49 && random_number % divisor != 0);
    
    return 0;
    
    char c;
        do
            {
                random_number = random_number_generator(lowest, highest);
                cout << random_number << endl;
    
                if(random_number % divisor == 0)
                break;
                else if((c=getchar())=='a')
                break;
                else;
    
                sleep(1);
    
            } while(1);
    
    #include <stdio.h>
    #include <conio.h> 
    
    int main(int argc, char *argv[])
    {
      int lowest = atoi(argv[1]);
      int highest = atoi(argv[2]);
      int divisor = atoi(argv[3]);
    
      int random_number;
      srand((unsigned)time(0));
    
      char c;
      do
      {
        random_number = random_number_generator(lowest, highest);
        printf("%d\n",random_number);
         if(random_number % divisor == 0)
         break;
         else if(kbhit()){
                c = getch();
                if(c=='a')
                break;
         }
         else;
        sleep(1);
      } while(1);
    
      return 0;
    }