我想做一个倒计时的问答游戏。问题是; 当我使用系统时,cls
所有打印都将进行。我尝试使用printf("/ b")
。在那种情况下,我无法从用户那里获取数据,因为系统处于循环中。
我可以保留问题输出并递减计数并从用户那里获取输入吗?
这是我的倒计时代码:
int v=30;
while(v!=0) {
printf("\n\t%d",v);
v--;
sleep(1);
system("cls");
}
如果我理解您的问题,并且只想在屏幕上的同一位置显示倒数,那么对于支持VT100仿真(和某些早期VTXX版本)的终端,您可以使用ANSI转义来控制光标的可见性和车回车键('\r'
)将光标位置返回到原始起点。如果对整型输出使用field-width修饰符,则甚至不需要ANSI转义符即可清除到行尾。如果您的倒数中包含可变数量的字符,则可以使用ANSI转义符清除到行尾,以确保在每次迭代中都删除所有文本。
例如,您可以这样做:
#include <stdio.h>
#include <unistd.h>
int main (void) {
int v = 30;
printf ("\033[?25l"); /* hide cursor */
while (v--) {
printf (" countdown: %2d\r", v); /* print, CR */
fflush (stdout); /* flush stdout */
sleep (1);
}
printf ("\033[?25h\n"); /* restore cursor, \n */
}
如果倒计时数字后确实还有其他文本,且每次迭代的长度都不同,则可以使用:
printf (" countdown: %2d\033[0k\r", v); /* print, clear to end, CR */
其中包括清除到行尾的转义\033[0k
。
上面使用的两个额外的ANSI转义是\033[?25l
(隐藏光标)和\033[?25h
(恢复光标)。
fflush(stdout);
之所以必须这样做,是因为C语言中的输出默认情况下是行缓冲的。没有fflush(stdout);
,所有输出将被缓冲,直到'\n'
遇到为止-使所有文本一次出现。
试试看。如果您具有VT兼容终端,它将可以正常工作。但请注意,不鼓励使用ANSI转义的原因是它们不可移植。并非所有终端都支持VT仿真(但很多...)。有关其他转义序列,请参见ANSI Escape序列-VT100 / VT52。
如果您要开发一个成熟的终端应用程序,并在屏幕上格式化许多输入和输出,则最好使用提供该功能的库(例如ncursees等)来为您服务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句