如何让程序不等待输入

时间:2016-08-22 21:34:36

标签: c

编辑1:

我想有一个程序可以检查按下的回车键,然后跳过一些代码(有点像某些游戏,当你启动时有可跳过的屏幕)。但我不希望它等待输入。

if(getchar()=='\n') 
{
goto skip;
}
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
//this is the where it should skip
skip:
printf("%s                                         Welcome to Guy's game!\n\n");
printf("Please enter your name: ");
gets(name);
Sleep(250);

我希望它在打印时检查输入"欢迎来到Guy的游戏!"所以无论何时我按下回车(只要它打印"欢迎来到盖伊的游戏!")我可以跳到代码的最后部分。 我无法弄清楚如何让它发挥作用。

更新

我还有一个问题,我忘了问... 我怎样才能修复"警告:隐含的功能声明'睡眠'当我使用时:

ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);

在for循环中。

3 个答案:

答案 0 :(得分:2)

您需要将终端更改为不进行规范密钥处理。

所有终端都会保留一段时间的信息,以允许用户点击退格(以及程序没有获得删除的字符)。在按下特殊的“缓冲区刷新”键(如Enter或Return)之前,不会将此键击缓冲发送到程序。

在游戏中,这是不受欢迎的,只要你能得到它们就想要钥匙。这意味着您的程序将需要termios数据结构,然后关闭(与终端通信)Canonical键处理。请注意,这意味着您必须在程序中处理退格擦除(如果您希望在程序的其他部分中使用它,例如输入名称以获得高分)。

// define a terminal configuration data structure
struct termios term;

// copy the stdin terminal configuration into term
tcgetattr( fileno(stdin), &term );

// turn off Canonical processing in term
term.c_lflag &= ~ICANON;

// set the terminal configuration for stdin according to term, now
tcsetattr( fileno(stdin), TCSANOW, &term);

请注意,这只会改善响应;但是,当终端与内核通信时,你仍然会有很小的延迟,然后内核会与你的程序进行通信。

例如,内核实际捕获按键向下/按键事件,并在短暂的计时器周期内对其进行评估,以确定按键是否需要“自动重复”。

我的建议是,如果您有兴趣快速完成游戏,则不要自行编写此代码。而是使用一个游戏编程库来适当地交互和配置你的环境,比如allegro。

但是,如果你对它的工作方式感兴趣,请务必编写代码来处理它(因为这是一个非常有趣的话题,你真的会更好地理解终端/程序/内核通信!)

答案 1 :(得分:0)

启动一个显示您的消息的主题。同时,阅读键盘等待命中。当用户点击进入时,终止显示文本的线程并恢复正常流程跳转到新屏幕。

答案 2 :(得分:0)

所以..我终于解决了!我创建了一个新程序,试图找到如何修复我正在进行的工作。

(代码进入

的[...]
Error   69.30.213.82    404 GET /dienstleister/eco-express/9260 HTTP/1.0        Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+) 23.8 K  Apache access

下一个例子)

任何信件:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void ClearScreen(void)
{
  system("cmd /c cls");
}

int main(void)
{
  [...] //Everything is in here for next examples
}

仅限一封信:

  int i=0;
  char name[20];

  while(1)
  {
    for(i=1; i>0&&i<5; i++)
    {
      //ClearScreen();
      printf("%i", i);
      printf("                                         Welcome to Guy's game!\n\n");
      Sleep(500);
      while (kbhit())
      { 
        getch();
        goto INPUT;
        i=0;
      }   
    }
  goto INPUT;
  }
  INPUT:
  ClearScreen();
  //this is the where it should skip
  printf("                                         Welcome to Guy's game!\n\n");
  printf("Please enter your name: ");
  gets(name);
  Sleep(250);
  printf("%s", name);
  return 0;

如果您愿意,可以在代码中使用它!祝你好运,谢谢你的所有答案!

* BTW我让它在循环中显示数字,以便证明程序有效,但是你可以把它拿走,因为它不需要。