使用ansi转义字符在两列中打印文本

时间:2019-04-16 14:23:28

标签: c ansi-escape

我正在尝试在终端的左半部分打印一个字符串,在终端的右半部分打印另一个字符串。我必须使用ANSI转义序列而不是ncurses来实现。我还想确保在该行的末尾不拆分任何单词。如果该行没有足够的空间来打印单词,那么我想在下一行上打印单词。

我尝试用printf(\ n)替换move调用,然后使用move到达屏幕的所需一半。似乎完全忽略了move调用。

#define clear() printf("\033[H\033[J")

void move(int y, int x)
{
    printf("\033[%d;%dH", y, x);
}

void print_left_right(int cols, char * left, char * right)
{
    clear();
    int cols_end = cols / 2;
    int line = 0;
    int current_pos = 0;
    char * l_split = strtok(left, " ");
    move(0, 0);
    while (l_split != NULL)
    {
        current_pos += (strlen(l_split) + 1); // plus one for space
        if (current_pos >= cols_end)
        {
            line += 1; // <----- doesn't seem to work
            move(line, 0); // <----- seems to work
            current_pos = 0;
        }
        printf("%s ", l_split);
        l_split = strtok(NULL, " ");
    }
    line = 0;
    current_pos = cols_end;
    char * r_split = strtok(right, " ");
    move(0, cols_end);
    while (r_split != NULL)
    {
        current_pos += (strlen(r_split) + 1);
        if (current_pos >= cols)
        {
            ++line;
            move(line, cols_end);
            current_pos = cols_end;
        }
        printf("%s ", r_split);
        r_split = strtok(NULL, " ");
    }
}

我使用strtok将给定的字符串拆分为单词,然后尝试打印它。如果单词不合适,我希望line变量增加并移到另一行。 但是,line变量不会增加,并且此代码始终重写同一行。奇怪的是,此举似乎正确地移至了终端的正确一半。 我想我正在做一些令人难以置信的愚蠢...

0 个答案:

没有答案