Как я могу достичь gotoxy() в gcc

Я использую GCC в Ubuntu. Так, я компилирую и выполняю в терминале. Но в онлайн-конкурсе по программированию они требуют вывода, как показано на диаграмме.

требуемый выход

Для этого, если я использую TURBOC, я могу получить его с помощью conio.h, используя gotoxy(), чтобы получить спиральный формат вывода. Но в Ubuntu, как мне этого добиться?

5 ответов

Решение

Используйте библиотеку ncurses.

Вот пример, адаптированный из http://www.paulgriffiths.net/program/c/srcs/curhellosrc.html

#include <stdlib.h>
#include <stdio.h>
#include <curses.h>

int main(void) {
    WINDOW * mainwin;

    /*  Initialize ncurses  */

    if ( (mainwin = initscr()) == NULL ) {
        fprintf(stderr, "Error initialising ncurses.\n");
        exit(EXIT_FAILURE);
    }

    move(10, 15);
    addch('X');
    refresh();

    getch();

    delwin(mainwin);
    endwin();
    refresh();

    return EXIT_SUCCESS;
}

Дополнительная информация доступна здесь: http://invisible-island.net/ncurses/ncurses-intro.html

Если предположить, что это соревнование, и они не хотят таких зависимостей, как ncurses, вы можете попытаться сделать это в памяти.

Установите двухмерный массив символов - строк и столбцов - скажем, 24x80. Напишите свою собственную версию gotoxy() который присваивает значения в соответствующие ячейки. Когда закончите черчение, распечатайте массив линий.

Помимо escape-последовательностей ANSI вы можете исследовать ncurses:

http://www.gnu.org/s/ncurses/

В конечном итоге все зависит от возможностей терминала, на котором выполняется программа, а не от фактического хоста, языка или библиотеки. Рассмотрим, что происходит, перенаправляя вывод программы в файл или на принтер.

conio.h API больше связан с фиксированной консолью, в Unix-подобных системах вы обычно работаете с терминалами, которые могут быть более разнообразными, такими как X-терминалы с изменяемым размером.

Определите, сколько строк вывода вам нужно. Выделите массив "char *" с одной записью на строку необходимого вывода. Когда вы помещаете число, используйте "realloc()", чтобы увеличить размер строки и заполните от старого конца до нового конца пробелами (если необходимо); затем поместите свой номер в нужном месте в этой строке (в памяти).

После того, как вы создали массив строк в памяти; выполните цикл for, который печатает каждую строку (и освобождает выделенную память).

Вам не нужно "gotoxy()" или что-либо еще, чтобы контролировать положение курсора.

Поскольку его здесь еще нет, я просто хотел сказать о примере использования escape-последовательностей ANSI, как упомянул Steve-o.

void gotoxy(int x, int y)
{
    printf("%c[%d;%df", 0x1B, y, x);
}

Я получил это отсюда.

0x1B является шестнадцатеричным для 27 в десятичном виде и является ASCII для ESC. Escape-последовательности начинаются с него

%m;%nf перемещает курсор в строку n, столбец m.

Экранирующие последовательности ANSI используются " для управления форматированием, цветом и другими параметрами вывода на видеотекстовых терминалах"

Другие вопросы по тегам