Как мы реализуем clrscr()
? В результате я обнаружил, что \x1b[2j
можно использовать для очистки экрана, но как мы его используем?
Стандартная библиотека C не обеспечивает способ очистки экрана. Для этого вам нужна библиотека, зависящая от операционной системы.
В DOS и Windows для программы, запущенной на консоли DOS или Windows, вы можете использовать расширения DOS / Windows, поставляемые в основной библиотеке C, поставляемой с ОС:
#include clrscr();
В Unix-системах вы можете использовать библиотеку curses, которая предоставляется с ОС. Порты библиотеки проклятий существуют для большинства операционных систем, в том числе для Windows, так что это путь в переносную программу. Свяжите свою программу с помощью -lcurses
и используйте
#include erase();
Некоторые терминалы и терминальные эмуляторы выполняют специальные функции, такие как очистка экрана, когда они получают escape-последовательность. Большинство терминалов соответствуют стандарту ANSI, который определяет несколько управляющих последовательностей; "\x1b[2J"
– такая последовательность, и ее эффект заключается в очистке экрана. Обратите внимание на капитал J
На таком терминале fputs("\x1b[2J", stdout)
очищает экран. Это то, что делает библиотека curses при вызове erase()
на таком терминале; библиотека curses включает в себя базу данных типов терминалов и какие escape-последовательности для использования на разных типах.
Если вы уверены, что это последовательность управления, которую вам нужно использовать, тогда:
#include int main(void) { fputs("\x1b[2j", stdout); return(0); }
Это преднамеренно пропускает новую строку – но вам может быть лучше, если добавить один после «j». Однако, как указывает Жиль в своем ответе , есть другие способы сделать это, которые имеют достоинства по сравнению с этим решением.
В Windows вы можете попробовать
#include #include #include void clrscr(void) { HANDLE std_out = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO cbi; COORD origin = {0,0}; int buf_length; GetConsoleScreenBufferInfo(std_out,&cbi); buf_length = cbi.dwSize.X*cbi.dwSize.Y; FillConsoleOutputCharacter(std_out,0x20,buf_length,origin,0); FillConsoleOutputAttribute(std_out,0x07,buf_length,origin,0); } int _tmain(int argc, wchar_t *argv[], wchar_t *envp[]) { DWORD i; _tprintf(TEXT("Clear screen probe...\n")); clrscr(); return 0; }
“\ x1b [H \ x1b [2J” работает на OSX.