C++ 停止C+中的无限循环+;按键时

C++ 停止C+中的无限循环+;按键时,c++,linux,loops,infinite-loop,C++,Linux,Loops,Infinite Loop,我有一个计划,如下所示: #include<iostream> using namespace std; int main() { while(true) { //do some task if(Any_key_pressed) break; } return 0; } C++并不能提供这样的方法。您将需要一个特定于平台的API来告诉您是否在不阻塞的情况下按下了键(或者输入在stdin上可用)。这意味

我有一个计划,如下所示:

#include<iostream>
using namespace std;
int main()
{
    while(true)
    {
        //do some task
        if(Any_key_pressed)
            break;
    }
return 0;
}

<

标准> C++并不能提供这样的方法。您将需要一个特定于平台的API来告诉您是否在不阻塞的情况下按下了键(或者输入在stdin上可用)。这意味着你需要告诉我们你在使用哪个平台。

标准C++没有提供一个方法来实现这一点。您将需要一个特定于平台的API来告诉您是否在不阻塞的情况下按下了键(或者输入在stdin上可用)。这意味着您需要告诉我们您使用的是哪个平台。

试试这个:

#include <iostream>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

using namespace std;

int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}

int main(void)
{

  while(!kbhit());

  cout<<"You pressed "<<(char)getchar();

  return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int kbhit(无效)
{
结构termios oldt,NETT;
int-ch;
int oldf;
tcgetattr(标准文件号和旧文件号);
newt=oldt;
newt.c|lflag&=~(ICANON | ECHO);
tcsetattr(标准文件号、TCSANOW和NETT);
oldf=fcntl(标准文件号,F\u GETFL,0);
fcntl(标准文件号、固定格式、非块格式);
ch=getchar();
tcsetattr(标准文件号、TCSANOW和oldt);
fcntl(标准文件号、固定格式、旧格式);
如果(ch!=EOF)
{
ungetc(ch、stdin);
返回1;
}
返回0;
}
内部主(空)
{
而(!kbhit());
试试这个:

#include <iostream>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

using namespace std;

int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}

int main(void)
{

  while(!kbhit());

  cout<<"You pressed "<<(char)getchar();

  return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int kbhit(无效)
{
结构termios oldt,NETT;
int-ch;
int oldf;
tcgetattr(标准文件号和旧文件号);
newt=oldt;
newt.c|lflag&=~(ICANON | ECHO);
tcsetattr(标准文件号、TCSANOW和NETT);
oldf=fcntl(标准文件号,F\u GETFL,0);
fcntl(标准文件号、固定格式、非块格式);
ch=getchar();
tcsetattr(标准文件号、TCSANOW和oldt);
fcntl(标准文件号、固定格式、旧格式);
如果(ch!=EOF)
{
ungetc(ch、stdin);
返回1;
}
返回0;
}
内部主(空)
{
而(!kbhit());

cout您可以使用SDL,它(大部分)与平台无关

#include<SDL/SDL.h>
...
#include<iostream>
using namespace std;
int main()
{
    while(true)
    {
        //do some task
        SDL_Event event
        while(SDL_PollEvent(&event))
        {
            if(event.type==SDL_KEYDOWN)
            {
                break;
            }
        }
    }
return 0;
}
#包括
...
#包括
使用名称空间std;
int main()
{
while(true)
{
//做一些工作
SDL_事件
while(SDL_事件和事件))
{
if(event.type==SDL\u KEYDOWN)
{
打破
}
}
}
返回0;
}
上述代码适用于Windows、Linux、MacOS以及许多其他操作系统。
至于如何设置SDL,您可以使用SDL,它(大部分)与平台无关

#include<SDL/SDL.h>
...
#include<iostream>
using namespace std;
int main()
{
    while(true)
    {
        //do some task
        SDL_Event event
        while(SDL_PollEvent(&event))
        {
            if(event.type==SDL_KEYDOWN)
            {
                break;
            }
        }
    }
return 0;
}
#包括
...
#包括
使用名称空间std;
int main()
{
while(true)
{
//做一些工作
SDL_事件
while(SDL_事件和事件))
{
if(event.type==SDL\u KEYDOWN)
{
打破
}
}
}
返回0;
}
上述代码适用于Windows、Linux、MacOS以及许多其他操作系统。 关于如何设置SDL,有一个。

您可以使用:

#包括
#包括
int main()
{
initscr();//初始化ncurses
noecho();//不打印结束循环的字符
游标集(0);//不显示游标
cbreak();//不要等待用户在按键后按ENTER键
nodelay(stdscr,TRUE);//nodelay选项使getch成为非阻塞调用。如果没有准备好的输入,getch返回ERR。如果禁用(bf为FALSE),getch将等待按键。
int-ch;
printw(“让我们玩一个游戏!按任意键退出。\n\n”);
而(1){//无限循环
如果((ch=getch())==ERR){//检查是否未按下任何键
printw(“.”;//如果没有按下任何键,请执行此操作
usleep(1000);
刷新();
}否则{//如果按了一个键。。。
nodelay(stdscr,false);//重置nodelay()
clear();//清除屏幕
break;//退出循环
}
}
mvprintw(第2行,第2-9行,“游戏结束”);
刷新();
getch();//等待character,以便在我们阅读“游戏结束”之前程序不会完成并退出
endwin();//终止ncurses
返回0;
}
您可以使用:

#包括
#包括
int main()
{
initscr();//初始化ncurses
noecho();//不打印结束循环的字符
游标集(0);//不显示游标
cbreak();//不要等待用户在按键后按ENTER键
nodelay(stdscr,TRUE);//nodelay选项使getch成为非阻塞调用。如果没有准备好的输入,getch返回ERR。如果禁用(bf为FALSE),getch将等待按键。
int-ch;
printw(“让我们玩一个游戏!按任意键退出。\n\n”);
而(1){//无限循环
如果((ch=getch())==ERR){//检查是否未按下任何键
printw(“.”;//如果没有按下任何键,请执行此操作
usleep(1000);
刷新();
}否则{//如果按了一个键。。。
nodelay(stdscr,false);//重置nodelay()
clear();//清除屏幕
break;//退出循环
}
}
mvprintw(第2行,第2-9行,“游戏结束”);
刷新();
getch();//等待character,以便在我们阅读“游戏结束”之前程序不会完成并退出
endwin();//终止ncurses
返回0;
}

这将在什么操作系统上运行?这是重要的特定于平台的API。你需要一个库来处理键盘输入。我个人喜欢OIS。或者你可以使用操作系统提供的任何东西。使用中断,或者分叉一个进程并阅读第19节讨论的标准。这将运行什么操作系统你需要一个库来处理键盘输入。我个人喜欢OIS。或者你可以使用任何提供的API