C中的可选输入

时间:2015-07-22 09:43:59

标签: c user-input scanf clock getchar

我正在尝试编写一个数字时钟程序,我遇到了这个问题。我想让用户选择退出程序,但无论我使用什么输入函数(scanf,getchar等),程序都会停止,直到我输入一个输入(是或否)以及时钟停止。这不是预期的,只要用户想退出,时钟就应该运行。 C中是否有任何方法可以为用户提供输入?

6 个答案:

答案 0 :(得分:3)

没有。经典IO是同步的,这意味着请求一行将阻止您的程序(您将无法执行任何操作 - 调度程序将跳过您),直到读取该行。

信号是为您想要的而设计的。在Unix上, Ctrl-\(向前台进程发送退出信号)将使程序退出。 Ctrl-c(向前台进程发送中断信号)通常也会导致退出。

退出是接收大多数信号的默认反应,但您可以采用不同的方式处理信号,然后将它们作为一种异步输入。

答案 1 :(得分:2)

我假设您实际上想要等待用户输入并同时运行时钟。如果您收到任何此类输入,您希望对其采取行动,否则请继续运行时钟。使用scanf / get char时会发生什么,它会一直等到实际有键盘输入。 (getchar比scanf更具反应性。每次按键时getchar都会返回.Scanf会等到按下enter键。)你真正想要的是“如果有任何按键命中”的逻辑。 kbhit就是你的答案。您的程序将如下所示:

#include <conio.h>
...
while(1) {
    if ( kbhit() ) {
        // Read the user input and act on it.
    } else {
        // Update the clock.
    }
}
...

答案 2 :(得分:1)

您可以使用kbhit

中的<conio.h>功能
#include <conio.h>

...

while( !kbhit() )
{
     /* update clock */
     ...

}
如果键盘缓冲区中有键,则

kbhit()返回非零值,否则返回零。

答案 3 :(得分:1)

一般来说,标准C(scanf(),getchar()等)使用行缓冲输入。无论用户在终端上输入什么,实际上都不会传递给程序,直到用户按下ENTER。

有些函数执行查询按键而不进行缓冲,但它们不是标准库的一部分。例如,来自<curses.h>的Unix上的getch()和来自Windows <conio.h>的{​​{3}}。{/ p>

或者用户可以简单地使用<Ctrl>-c退出程序...

答案 4 :(得分:0)

这可能很棘手,但是 您可以在读取标准输入时进行无限循环,当用户输入exit命令时,返回0以结束它?

答案 5 :(得分:0)

该计划可以

1) set the console to 'raw' mode
2) set a interrupt handler for the keyboard inputs
3) the interrupt handler sets a global flag
4) the main/clock update function, on each loop,
   looks at the global flag and if the global flag is set, exits