[英]Is it possible to display a printf() statement for a limited amount of time n c?
我是编码的初学者,我被指示编写基于文本的游戏,所以我试图弄清楚是否可以在C中打印一段有限时间的语句, 是否也可以让他们输入一个在有限的时间内回答 ? 问题是如果我打印出来的东西,它们可以向上滚动,这就是我想要避免的。 如果可能,请输入我可能用于下面参考的代码或资源。 谢谢。
默认情况下,终端设计为在缓冲区中逐渐发出越来越多的文本行。 文本被添加到末尾,前面的行仍然可见(达到终端配置的缓冲区大小的限制)。
通过改变终端模式可以获得更多的“GUI”感觉,这通常使用像curses或ncurses这样的库来完成。 这将允许您在窗口的特定部分显示文本,并删除所述文本。 在结束程序时, curses “重置”终端,使得整个“GUI”消失(尽管一些终端仍然向用户显示GUI的“最终状态”,如果他们向上滚动页面)。
一个代码示例是关于如何使用ncurses的教程,这对于这种介质来说有点过于宽泛,但不难发现。
由于你是初级课程,你可能会被鼓励去做下一个最好的事情,那就是:
在上述所有情况下,除#3外,实施“计时器”的责任应由您自己承担。
您可以打印退格键以删除刚刚显示的文本。 像这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
char * string = "Hello";
printf("%s", string);
fflush(stdout);
sleep(1);
char * backspaces = malloc(strlen(string) * sizeof(char));
for (int i = 0 ; i < strlen(string) ; i++) backspaces[i] = '\b';
printf("%s", backspaces);
}
对于有限时间的有效输入,您可以使用gettimeofday来检查输入是否在时间内。
使用ANSI转义命令1)记住光标当前所在的位置2)printf该行(并记住printf()
返回的值3)当定时器/闹钟到期时启动定时器(例如使用alarm()
)信号将被提升。 使用信号标记事件,然后在主代码中:如果signalflag断言,使用ANSI转义序列将光标移动到保存/记住的位置,然后写入从原始printf()
返回的长度的空间数据。 然后恢复光标
您可以使用\\r
来将打印光标带到行的开头。 所以你可以替换那些内容,以达到在某段时间后删除内容的效果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.