Есть ли «правильный» способ очистить окно консоли в C, помимо использования system("cls")
?
Как очистить экран консоли в C?
Ответы (13)
Ну, C не понимает концепцию экрана. Таким образом, любой код не будет переносимым. Можете взглянуть на conio.h или curses, в соответствии с вашими потребностями?
Переносимость является проблемой, независимо от того, какая библиотека используется.
printf("\e[1;1H\e[2J");
Эта функция будет работать на терминалах ANSI, требует POSIX. Я предполагаю, что есть версия, которая также может работать на консоли окна, поскольку она также поддерживает escape-последовательности ANSI.
#include <unistd.h>
void clearScreen()
{
const char *CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 12);
}
Есть и другие альтернативы, некоторые из которых не перемещают курсор на {1,1} .
"\e[2J"
. Я знаю, что прошло около четырех лет, но... Не хочешь объяснить разницу? Или что должен делать "\e[1;1H"
?
- person Braden Best; 19.09.2015
\033[2J\033[1;1H
- person Geremia; 21.01.2017
printf(string);
, вместо этого используйте puts(string);
. У первого может быть UB, если string
содержит знак процента (хотя здесь это не так, я рекомендую сделать это привычкой).
- person Arne Vogel; 20.06.2018
\033[x;yH
переместит курсор в строку x
столбца y
. Если x
равно 1, его можно опустить: \033[;yH
. en.wikipedia.org/wiki/
- person Dosisod; 03.06.2020
Для переносимости попробуйте следующее:
#ifdef _WIN32
#include <conio.h>
#else
#include <stdio.h>
#define clrscr() printf("\e[1;1H\e[2J")
#endif
Затем просто позвоните clrscr()
. В Windows он будет использовать код clrscr()
conio.h
, а в Linux — управляющие коды ANSI.
Если вы действительно хотите сделать это "правильно", вы можете устранить посредников (conio
, printf
и т. д.) и сделать это только с помощью низкоуровневых системных инструментов (подготовьтесь к массивному дампу кода). ):
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
void ClearScreen()
{
HANDLE hStdOut;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD count;
DWORD cellCount;
COORD homeCoords = { 0, 0 };
hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
if (hStdOut == INVALID_HANDLE_VALUE) return;
/* Get the number of cells in the current buffer */
if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
cellCount = csbi.dwSize.X *csbi.dwSize.Y;
/* Fill the entire buffer with spaces */
if (!FillConsoleOutputCharacter(
hStdOut,
(TCHAR) ' ',
cellCount,
homeCoords,
&count
)) return;
/* Fill the entire buffer with the current colors and attributes */
if (!FillConsoleOutputAttribute(
hStdOut,
csbi.wAttributes,
cellCount,
homeCoords,
&count
)) return;
/* Move the cursor home */
SetConsoleCursorPosition( hStdOut, homeCoords );
}
#else // !_WIN32
#include <unistd.h>
#include <term.h>
void ClearScreen()
{
if (!cur_term)
{
int result;
setupterm( NULL, STDOUT_FILENO, &result );
if (result <= 0) return;
}
putp( tigetstr( "clear" ) );
}
#endif
Обходной путь, протестированный в Windows (cmd.exe), Linux (Bash и zsh) и OS X (zsh):
#include <stdlib.h>
void clrscr()
{
system("@cls||clear");
}
system
вызывает команды для других языков (саид, bash, zsh, пакет и т. д.). Еще +1, чтобы попытаться сделать его переносимым. (Я тестировал на debian/linux и win7, даже инвертируя аргументы. @ также не нужен, потому что команда не будет отображаться на экране после запуска)
- person DrBeco; 30.11.2015
Используя макросы, вы можете проверить, используете ли вы Windows, Linux, Mac или Unix, и вызвать соответствующую функцию в зависимости от текущей платформы. Что-то вроде следующего:
void clear(){
#if defined(__linux__) || defined(__unix__) || defined(__APPLE__)
system("clear");
#endif
#if defined(_WIN32) || defined(_WIN64)
system("cls");
#endif
}
Поскольку вы упоминаете cls
, похоже, вы имеете в виду окна. Если это так, то в этом элементе базы знаний есть код, который это сделает. Я только что попробовал, и это сработало, когда я вызвал его со следующим кодом:
cls( GetStdHandle( STD_OUTPUT_HANDLE ));
non-ISO-standard escape sequence, '\e'
при использовании этого с C11.
- person Geremia; 21.01.2017
#include <conio.h>
и использовать
clrscr()
Для этого нет переносимого C-способа. Хотя различные библиотеки управления курсором, такие как curses, относительно переносимы. conio.h можно переносить между OS/2 DOS и Windows, но не в *nix варианты.
Вся концепция консоли — это концепция, выходящая за рамки стандарта C.
Если вы ищете чистое решение API Win32, в API консоли Windows нет единого вызова для этого. Одним из способов является FillConsoleOutputCharacter достаточно большого количество символов. Или WriteConsoleOutput. Вы можете использовать GetConsoleScreenBufferInfo , чтобы узнать, сколько символов будет достаточно.
Вы также можете создать совершенно новый буфер экрана консоли и сделать его текущим.
Окна:
system("cls");
Юникс:
system("clear");
Вместо этого вы можете вставлять символы новой строки до тех пор, пока все не будет прокручено. noreferrer">здесь.
При этом вы легко достигаете переносимости.
Forty quadvigiseptanovatriheptasexgesillion
, который у нас не будет ЦП, способных обрабатывать, пока у нас не будет 2048-битного ЦП с библиотекой bitchin bignum. Извините, вам не повезло. Вам просто придется смириться с тем фактом, что люди, которые запускают свою систему, используя сторону Эмпайр-стейт-билдинг в качестве проекционного монитора с полноэкранным терминалом, использующим шрифт 1pt, получат уродливо выглядящий четкий эффект. Это редкий пограничный случай. В противном случае ~ 100 строк должны помочь. (Xterm, использующий шрифт по умолчанию в полноэкранном режиме на мониторе 1080p, имеет высоту всего 74 строки)
- person Braden Best; 19.09.2015
просто введите clrscr(); функция в void main().
например:
void main()
{
clrscr();
printf("Hello m fresher in programming c.");
getch();
}
clrscr();
функция легко очистить экран.
void main
очень плохо. stackoverflow.com/questions/9442121/ а>
- person Shiva; 05.10.2014
test.c:(.text+0x31): undefined reference to 'clrscr' collect2: error: ld returned 1 exit status
. С включенными stdio.h и stdlib.h. Не портативный.
- person Braden Best; 19.09.2015
В Windows я сделал ошибку, используя
system("clear")
но это на самом деле для Linux
Тип Windows
system("cls")
без #include conio.h
Правильный способ сделать это — использовать функции tput
или terminfo
для получения свойств терминала, а затем вставлять новые строки в соответствии с размерами.
Это должно работать. Затем просто вызовите cls(); всякий раз, когда вы хотите очистить экран.
(используя метод, предложенный ранее.)
#include <stdio.h>
void cls()
{
int x;
for ( x = 0; x < 10; x++ )
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}
while
или for
) была бы немного более элегантной. См., например: cprogramming.com/faq/cgi- корзина/
- person lurker; 15.10.2013