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