2015-12-27 2 views
0

У меня есть следующий код:Дополнительные Пробелы добавляемых После Clear Screen

#include <unistd.h> 
#include <stdio.h> 
#include <stdbool.h> 

#define RESET "\x1b[1J" 

#define D "\x1b[0m" 
#define Y "\x1b[33;1m" 
#define W "\x1b[37;1m" 
#define B "\x1b[30;1m" 

void printLeft(bool color) 
{ 
    if (color) { 
    printf(Y "    __\n" 
      "   /|\n" 
      "   / \\\n" 
      "   / |\n" 
      W "  _\\| " Y "|" W "[" B "*" W "][" B "*" W "]" Y "| " W "|/_\n" 
      "  \\ " Y "|  | " W "/\n" 
      "   --" Y "|" W "\\____/" Y "|" W "--\n" 
      Y "   \\  |\n" 
      "   \\  /\n" 
      "    \\ |\n" 
      W "    |" Y "\\__|" W "|\n" 
      "    | |\n" 
      "   ==| |=="); 
    } else { 
    printf("    __\n" 
      "   /|\n" 
      "   / \\\n" 
      "   / |\n" 
      "  _\\| |[*][*]| |/_\n" 
      "  \\ |  | /\n" 
      "   --|\\____/|--\n" 
      "   \\  |\n" 
      "   \\  /\n" 
      "    \\ |\n" 
      "    |\\__||\n" 
      "    | |\n" 
      "   ==| |=="); 
    } 
} 

void printRight(bool color) { 
    if (color) { 
    printf(Y "    __\n" 
      "    | \\\n" 
      "   / \\\n" 
      "    |  \\\n" 
      W "  _\\| " Y "|" W "[" B "*" W "][" B "*" W "]" Y "| " W "|/_\n" 
      "   \\ " Y "|  | " W "/\n" 
      "   --" Y "|" W "\\____/" Y "|" W "--\n" 
      Y "    |  /\n" 
      "    \\  /\n" 
      "    | /\n" 
      W "    |" Y "|__/" W "|\n" 
      "    | |\n" 
      "   ==| |=="); 
    } else { 
    printf("    __\n" 
      "    | \\\n" 
      "   / \\\n" 
      "    |  \\\n" 
      "  _\\| |[*][*]| |/_\n" 
      "   \\ |  | /\n" 
      "   --|\\____/|--\n" 
      "    |  /\n" 
      "    \\  /\n" 
      "    | /\n" 
      "    ||__/|\n" 
      "    | |\n" 
      "   ==| |=="); 
    } 
} 

void printBottom(bool color) { 
    if (color) { 
    printf(Y "    __\n" 
      "    | |\n" 
      "   / \\\n" 
      "   |  |\n" 
      "   |" W "[" B "*" W "][" B "*" W "]" Y"|\n" 
      "   |  |\n" 
      W "  _\\| " Y "|" W "\\____/" Y "| " W "|/_\n" 
      "   \\/" Y "|  |" W "\\/\n" 
      Y "   |  |\n" 
      W "   /\\" Y "\\ /" W "/\\\n" 
      "  ==/ " Y "|__| " W "\\=="); 
    } else { 
    printf("    __\n" 
      "    | |\n" 
      "   / \\\n" 
      "   |  |\n" 
      "   |[*][*]|\n" 
      "   |  |\n" 
      "  _\\| |\\____/| |/_\n" 
      "   \\/|  |\\/\n" 
      "   |  |\n" 
      "   /\\\\ //\\\n" 
      "  ==/ |__| \\=="); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    short counter = 0; 
    while (1) { 
    printf(RESET); 
    if (counter == 0) printLeft(true); 
    else if (counter == 2) printRight(true); 
    else printBottom(true); 
    if (true) { 
     printf(Y "\n\n\"IT'S PEANUT BUTTER JELLY TIME\"" D); 
    } else { 
     printf("\n\n\"IT'S PEANUT BUTTER JELLY TIME\""); 
    } 
    fflush(stdout); 
    usleep(200000); 
    counter = (counter + 1) % 4; 
    } 
    return 0; 
} 

Все работает прекрасно, за исключением одной вещи. Там, как представляется, дополнительное пространство добавляется на первой линии:

extra space

Как я могу избавиться от этого дополнительного пространства?

+0

Является ли это из-за неисправного логики здесь: 'если (правда) {...} еще {...}', который вызывает первый текст выходной всегда выводиться? –

+0

@WeatherVane Для каждого метода да будет выведена цветовая версия. Я добавлю флаг для переключения цвета или цвета позже. – carloabelli

+0

отсутствующий код отсутствует. #Include для stdio.h и unistd.h и stdbool.h Не существует определения 'RESET'. – user3629249

ответ

1

В то время как я не могу проверить с кодами управления на моей системе, вы, скорее всего, потребуется \n после этого текста:

printf(Y "\n\n\"IT'S PEANUT BUTTER JELLY TIME\"\n" D); 

По крайней мере, это фиксирует та же проблема здесь в системе Windows, (и Y и D, по-видимому, представляют собой коды управления цветом, поэтому это не должно влиять на положение в любом случае).

Update:

кажется position control code тоже существует (не могу проверить его здесь, хотя):

#define  GOTOYX "\x1B[%.2d;%.2dH" 
    Set cursor to (y, x). More... 

Таким образом, вы могли бы использовать этот код, чтобы расположить первую строку вместо того, чтобы дополнительная новая строка.

+0

Это действительно работает, но на самом деле это добавляет дополнительную строку новой строки, которая, я думаю, не конец света. Спасибо! – carloabelli

+0

Возможно, вы можете сделать чек, когда добавить новую строку, а когда нет? Но разве у вас нет контрольных кодов, доступных для позиции? Это может быть даже лучше. –

+0

Да. Кажется, я понял это. Возможно, '\ x1b [1J' сохраняет позицию курсора (я думал, что он сбросит его). Я найду управляющий код, чтобы исправить это. Спасибо за вашу помощь! :) – carloabelli

0

Попробуйте вставить символ \n перед первой строкой.

+0

Он медленно перемещается по экрану, но потом это работает. – carloabelli

0

I; m on ubuntu linux 14.04 компиляция с gcc.

Следующий код полностью компилирует и выполняет требуемую операцию.

Мне не удалось получить \1b[2j (чистый экран), чтобы работать, и обнаружил, что мне это не нужно.

Некоторые из существенных изменений было

  1. конца последней строки каждого графическим с \n так последней строкой всегда сразу выходом
  2. изменил графику на все иметь одинаковую ширину и высоту
  3. модифицировал if(true) заявление на чередование между цветным и открытым текстом
  4. удаленный ненужный звонок по телефону fflush()
  5. причина плохого смещения для первой строки графика не использовала правильный интервал, чтобы разрешить w в начале строки на графике и не выводить весь графический вывод и не превращать все графики в одну и ту же высоту/ширина.

Следующий код является результатом

#define _GNU_SOURCE 
#include <stdio.h> 
#include <unistd.h> 
#include <stdbool.h> 

#define D "\x1b[0m" 
#define Y "\x1b[33;1m" 
#define W "\x1b[37;1m" 
#define B "\x1b[30;1m" 
#define CURSOR_1_1 "\x1b[1;1f \n" 

void printLeft(bool color) 
{ 
    if (color) { 
    printf(CURSOR_1_1 
      Y 
      "    __        \n" 
      "   /|        \n" 
      "   / \\        \n" 
      "   / |        \n" 
      W 
      "  _\\| " Y "|" W "[" B "*" W "][" B "*" W "]" Y "| " W "|/_\n" 
      "  \\ " Y "|  | " W "/    \n" 
      "   --" Y "|" W "\\____/" Y "|" W "--  \n" 
      Y 
      "   \\  |       \n" 
      "   \\ /       \n" 
      "    \\ |        \n" 
      W 
      "    |" Y "\\__|" W "|     \n" 
      "    | |        \n" 
      "   ==| |=       \n"); 
    } else { 
    printf(CURSOR_1_1 
      "    __        \n" 
      "   /|        \n" 
      "   / \\        \n" 
      "   / |        \n" 
      "  _\\| |[*][*]| |/_      \n" 
      "  \\ |  |/      \n" 
      "   --|\\____/|--       \n" 
      "   \\  |       \n" 
      "   \\ /       \n" 
      "    \\ |        \n" 
      "    |\\__||       \n" 
      "    | |        \n" 
      "   ==| |==       \n"); 
    } 
} 

void printRight(bool color) { 
    if (color) { 
    printf(CURSOR_1_1 
      Y 
      "    __        \n" 
      "    | \\        \n" 
      "   / \\       \n" 
      "    |  \\       \n" 
      W 
      "  _\\| " Y "|" W "[" B "*" W "][" B "*" W "]" Y "| " W "|/_  \n" 
      "   \\ " Y "|  | " W "/    \n" 
      "   --" Y "|" W "\\____/" Y "|" W "-- \n" 
      Y 
      "    | /       \n" 
      "    \\ /       \n" 
      "    | /       \n" 
      W 
      "    |" Y "|__/" W "|     \n" 
      "    | |        \n" 
      "   ==| |==       \n"); 
    } else { 
    printf(CURSOR_1_1 
      "    __        \n" 
      "    | \\        \n" 
      "   / \\       \n" 
      "    |  \\       \n" 
      "  _\\| |[*][*]| |/_      \n" 
      "   \\ |  |/      \n" 
      "   --|\\____/|--      \n" 
      "    | /       \n" 
      "    \\ /       \n" 
      "    | /       \n" 
      "    ||__/|        \n" 
      "    | |        \n" 
      "   ==| |==       \n"); 
    } 
} 

void printBottom(bool color) { 
    if (color) { 
    printf(CURSOR_1_1 
      Y 
      "    __        \n" 
      "    | |        \n" 
      "   / \\       \n" 
      "   |  |       \n" 
      "   |" W "[" B "*" W "][" B "*" W "]" Y"|   \n" 
      "   |  |       \n" 
      W 
      "  _\\| " Y "|" W "\\____/" Y "| " W "|/_ \n" 
      "   \\/" Y "|  |" W "\\/    \n" 
      Y 
      "   |  |       \n" 
      W 
      "   /\\" Y "\\ /" W "/\\    \n" 
      "  ==/ " Y "|__| " W "\\==    \n" 
      "            \n" 
      "            \n"); 
    } else { 
    printf(CURSOR_1_1 
      "    __        \n" 
      "    | |        \n" 
      "   / \\       \n" 
      "   |  |       \n" 
      "   |[*][*]|       \n" 
      "   |  |       \n" 
      "  _\\| |\\____/| |/_      \n" 
      "   \\/|  |\\/      \n" 
      "   |  |       \n" 
      "   /\\\\ //\\      \n" 
      "  ==/ |__| \\==      \n" 
      "            \n" 
      "            \n"); 
    } 
} 

int main(void) 
{ 
    int counter = 0; 
    printf(CURSOR_1_1); 
    while (1) 
    { 
     if (counter == 0) printLeft(true); 
     else if (counter == 2) printRight(true); 
     else printBottom(true); 

     if (counter&0x01) 
     { 
      printf(Y "\n\n\"IT'S PEANUT BUTTER JELLY TIME\"%s\n", D); 
     } 

     else 
     { 
      printf("\n\n\"IT'S PEANUT BUTTER JELLY TIME\"\n"); 
     } 
     //fflush(stdout); 
     usleep(200000); 
     counter = (counter + 1) % 4; 
    } 
    return 0; 
}