我制作了以下屏幕保护程序。我使用ANSI代码,清除终端屏幕并定义当前时间的位置。但是,多次打印相同的ANSI代码。例如,在行中:
printf( "\e[%d;%df%s\n", random_line, random_column, ctime( &t1 ));
已打印 - >
[0; -14fMon Jun 1 13:39:49 2015
我的代码是:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
int main( void )
{
int lines = 0, columns = 0, random_line = 0, random_column = 0;
time_t t1;
struct winsize w;
while( 1 )
{
printf( "\e[2J\n" );
ioctl( 0, TIOCGWINSZ, &w );
//printf( "Lines of Term: %d\n", w.ws_row );
//printf( "Columns of Term: %d\n", w.ws_col );
lines = w.ws_row;
columns = w.ws_col;
srand( time( NULL ) );
random_line = rand() % lines;
//printf( "Random Line = %d\n", random_line );
random_column = ( rand() % columns ) - 20;
//printf( "Random Column = %d\n", random_column );
t1 = time( NULL );
printf( "\e[%d;%df%s\n", random_line, random_column, ctime( &t1 ) );
sleep( 5 );
}
return ( 0 );
}
答案 0 :(得分:1)
当您为行或列提供否定值时,ANSI转义序列格式不正确,这就是您看到以下内容的原因:
[0;-14fMon Jun 1 13:39:49 2015
而不是字符串:
Mon Jun 1 13:39:49 2015
位于某处。
基本上,ANSI序列解释器不知道如何将光标14个字符放在屏幕最左侧的左侧,所以你应该重新访问为什么你要减去{ {1}}从随机值中获取列。
如果要确保文本适合所选的行而不包装到下一行,则应改为使用(更改值,因为日期字符串中包含超过20个字符) :
20