getch()未响应停止循环

getch() not responding to stop loop

本文关键字:循环 响应 getch      更新时间:2023-10-16

假设ncurses头在那里,并且我的random_number_generator()方法正在工作。我试图通过点击"a"退出循环(最终我想通过点击CtrlE退出)。

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

  1. 如果随机数是除数的倍数,它将退出。

  2. 如果我使用getch(),它将退出。我认为这应该有效,但当我点击a时,它不会退出。

    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));
      int c;
      do
      {
        random_number = random_number_generator(lowest, highest);
        cout << random_number << endl;
        sleep(1);
      } while(random_number % divisor != 0 || (c=getch())!=49);
      return 0;
    }
    

编辑:

我试着把条件改成&amp;但是getch仍然不让它退出:

随机数输出范围1-10:

4
a3    <-hit a
aaa4  <-hit a many times
5     <-exits

由于逻辑或运算符||的短路行为,如果第一个表达式true second不执行。

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

因为random_number % divisor != 0是真的,所以它不在乎你输入什么

使用&&代替

无论何时使用条件,都要确保所有部分都按预期运行。

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

do
    {
        random_number = random_number_generator(lowest, highest);
        cout << random_number << endl;
        sleep(1);
    } while(random_number % divisor != 0 && (c=getch())!='a');

现在,如果输入"a",则第二个条件为false,循环终止。

while循环有一个带有两个条件的OR运算符(||),在这种情况下,求值是从左到右执行的。有两种情况下,条件可以为true,一种是如果random_number%除数==0,另一种是c=getch()==49,如果这两个条件中的任何一个为true,则循环将终止,否则将执行下一次迭代。

由于条件求值是从左到右执行的,因此如果while()中的第一个条件为true,则执行下一次迭代,因此无论何时random_number%除数==0,都将执行下一个迭代。

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

因为在任何给定的输入中,至少满足一个条件,或者(||)继续循环。USe和(&&)。

更改操作|| to &&,并使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;
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("%dn",random_number);
     if(random_number % divisor == 0)
     break;
     else if(kbhit()){
            c = getch();
            if(c=='a')
            break;
     }
     else;
    sleep(1);
  } while(1);
  return 0;
}