在C语言中,如何在不停止执行的情况下从用户处获取字符?

在C语言中,如何在不停止执行的情况下从用户处获取字符?,c,C,getch或getche停止输出,直到未输入字符。我希望我的代码在循环中不断请求字符,而不希望停止代码的执行?您应该使用并发编程,这样您可以执行以下操作:当父进程等待输入时,子进程执行其余代码 您可以在linux中使用函数fork()来实现这一点 要检查当前进程是父进程还是子进程,应执行以下操作: // CREATE PID AND PROCESS pid_t pid; pid = fork(); if (pid < 0) puts("ERROR"); else if (pid ==

getch
getche
停止输出,直到未输入字符。我希望我的代码在循环中不断请求字符,而不希望停止代码的执行?

您应该使用并发编程,这样您可以执行以下操作:当父进程等待输入时,子进程执行其余代码

您可以在linux中使用函数
fork()
来实现这一点

要检查当前进程是父进程还是子进程,应执行以下操作:

// CREATE PID AND PROCESS
pid_t pid;
pid = fork();

if (pid < 0)
  puts("ERROR");
else if (pid == 0)
  puts("CHILD");
  // CODE YOU WANT TO EXECUTE
else
  puts("FATHER");
  // CODE THAT WAITS FOR INPUT
//创建PID和流程
pid_t pid;
pid=fork();
if(pid<0)
看跌期权(“错误”);
否则如果(pid==0)
出售(“儿童”);
//要执行的代码
其他的
出售(“父亲”);
//等待输入的代码

您也可以使用线程。

您正在寻找的是一个非阻塞的输入调用(这意味着如果没有可用的输入,它不会阻塞,但会立即返回)

如果您谈论的是
getch()
,则很容易将其设置为非阻塞:只需调用


只是为了好玩,我用<代码>诅咒< /Case>函数创建了一条“蛇”,函数被剥离到最小值,

当计算机的CLI C或C++程序试图从键盘读取密钥(例如,使用“GeCHAR”)时,计算机冻结和等待输入的问题不在程序的直接控制之下。“幕后”发生的事情是这样的:你的程序对处理你的键盘输入和屏幕输出的任何“终端”程序进行函数调用。在Linux中,这称为“控制台”。在原始窗口中,它被称为“cmd.exe”。在Cygwin中,它被称为“mintty.exe”。终端导致“冻结”,直到用户按下一个或多个键,然后按Enter键,才返回

要解决此问题,您需要临时更改终端的设置。为此,请研究用于配置终端的程序的名称。在Linux和Cygwin中,这是“stty”。用于从更改“超时”的stty命令∞ “分秒”(默认值)到“1分秒”(这是您需要的)是“时间1”

在Linux或Cygwin系统上,用于在不延迟程序执行的情况下获取击键的函数如下所示(如果系统使用stty以外的内容来配置其终端,则必须更改system()调用的内容):


如果没有按下任何键,或按下任何键的ASCII码,则返回“-1”。

查看
选择
或线程这是操作系统特定的查看
kbhit()
@CoolGuy:这不是标准函数。@Olaf我知道。但是对于OP来说,
getch
/
getche
似乎也不管用。一个基于云的应用程序仅仅是为了得到一个按键怎么样?这将更加复杂。我正在制作一个蛇游戏,我希望我的代码在C语言中要求角色,即上、下、左、右。我正在制作一个蛇游戏,我希望我的代码在C语言中要求角色,即上、下、左、右。那么?您通常需要非阻塞输入
getch()
不是一个标准的c函数,我告诉过您如果
诅咒
getch()
,请参见。如果您正在谈论另一个库的
getch()
,那么您需要在问题中更加具体
// Check for recent keypress on keyboard; if there is one,
// get that character; but time-out after 1 decisecond if
// input does not immediately occur (keep executing program):
char getkey_unlocked (void)
{
   char A;
   system("stty -icanon");
   system("stty -echo");
   system("stty time 1"); // CHANGE TIMEOUT FROM ∞ TO 1/10 SECOND
   A = (char)getchar();
   system("stty echo");
   system("stty icanon");
   return A;
}