getch()没有响应停止循环

时间:2013-09-05 05:36:48

标签: c++ linux loops getch

假设存在ncurses标头并且我的random_number_generator()方法正在运行。我试图通过点击'a'退出循环(最终我想通过点击 Ctrl E 退出)。

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

  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;
    }
    
  3. 修改

    我尝试将条件更改为&amp;&amp;相反,但getch仍然不让它退出:

    随机数输出范围1-10:

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

8 个答案:

答案 0 :(得分:2)

由于第一个表达式true second不执行,因此逻辑或运算符||的{​​{3}}行为。

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

答案 1 :(得分:0)

因为random_number % divisor != 0是真的,这就是为什么它不关心你输入什么

使用&&代替

答案 2 :(得分: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,循环终止。

答案 3 :(得分:0)

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

由于条件评估是从左到右执行的,所以如果while()内的第一个条件为真,则执行下一次迭代,因此只要random_number%divisor == 0,就会执行下一次迭代。 / p>

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

更改您的操作|| 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;

答案 6 :(得分: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);

答案 7 :(得分:0)

#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;
}