在C程序中使用ANSI代码

时间:2015-06-01 10:52:49

标签: c

我制作了以下屏幕保护程序。我使用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 );
}

1 个答案:

答案 0 :(得分:1)

当您为行或列提供否定值时,ANSI转义序列格式不正确,这就是您看到以下内容的原因:

[0;-14fMon Jun 1 13:39:49 2015

而不是字符串:

Mon Jun 1 13:39:49 2015

位于某处。

基本上,ANSI序列解释器不知道如何将光标14个字符放在屏幕最左侧的左侧,所以你应该重新访问为什么你要减去{ {1}}从随机值中获取列。

如果要确保文本适合所选的行而不包装到下一行,则应改为使用(更改值,因为日期字符串中包含超过20个字符) :

20