C++ getch()不响应停止循环
假设ncurses标头在那里,并且我的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]); 整数除数=
随机数\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;
做
{
随机数=随机数发生器(最低、最高);
coutcharc;
做
{
随机数=随机数发生器(最低、最高);
不能包含
#包括
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;
}