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

时间:2017-05-20 13:27:11

标签: c

getchgetche会停止输出,直到输入字符为止。我希望我的代码继续在循环中询问字符而不想停止执行代码?

3 个答案:

答案 0 :(得分:2)

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

如果您正在谈论recipeDiv = []; recipeDiv[i] = $("<div/>").addClass("recipeBlock"); recipeDiv[i].appendChild(someElement); curses function,则很容易将其设为非阻止:只需致电timeout(0)

为了好玩,我创建了一条“蛇”,使用getch()函数剥离到最低限度for reference

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:-2)

你应该使用并发编程,你可以这样做:当父进程等待输入时,子进程执行剩下的代码。

您可以使用函数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

您也可以使用线程。