Как я могу достичь 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:
В конечном итоге все зависит от возможностей терминала, на котором выполняется программа, а не от фактического хоста, языка или библиотеки. Рассмотрим, что происходит, перенаправляя вывод программы в файл или на принтер.
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 используются " для управления форматированием, цветом и другими параметрами вывода на видеотекстовых терминалах"