Подтвердить что ты не робот

Как очистить экран консоли в C?

Есть ли "правильный" способ очистить окно консоли на C, кроме того, используя system("cls")?

4b9b3361

Ответ 1

Ну, C не понимает концепцию экрана. Таким образом, любой код не будет переносимым. Возможно, посмотрите conio.h или curses, в соответствии с вашими потребностями?

Переносимость - это проблема, независимо от того, какая библиотека используется.

Ответ 2

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}.

Ответ 3

Поскольку вы упоминаете cls, это звучит так, будто вы имеете в виду окна. Если это так, то этот элемент KB имеет код, который это сделает. Я просто попробовал, и это сработало, когда я вызвал его со следующим кодом:

cls( GetStdHandle( STD_OUTPUT_HANDLE ));

Ответ 4

#include <conio.h>

и используйте

clrscr()

Ответ 5

Обходной путь, протестированный в Windows (cmd.exe), Linux (Bash и zsh) и OS X (zsh):

#include <stdlib.h>

void clrscr()
{
    system("@cls||clear");
}

Ответ 6

Не существует портативного способа C для этого. Хотя различные библиотеки манипулирования курсором, такие как проклятия, относительно переносимы. conio.h переносится между OS/2 DOS и Windows, но не с * nix вариантами.

Все понятие "консоли" представляет собой концепцию, выходящую за рамки стандарта C.

Если вы ищете чистое решение для Win32 API, для этого нет единого вызова в консольном API Windows. Одним из способов является FillConsoleOutputCharacter достаточно большого количества символов. Или WriteConsoleOutput Вы можете использовать GetConsoleScreenBufferInfo, чтобы узнать, сколько символов будет достаточно.

Вы также можете создать совершенно новый буфер буфера консоли и сделать текущий.

Ответ 7

С помощью макросов вы можете проверить, находитесь ли вы в Windows, Linux, Mac или Unix и вызываете соответствующую функцию в зависимости от текущей платформы. Что-то следующее:

void clear(){
    #if defined(__linux__) || defined(__unix__) || defined(__APPLE__)
        system("clear");
    #endif

    #if defined(_WIN32) || defined(_WIN64)
        system("cls");
    #endif
}

Ответ 8

Для переносимости попробуйте следующее:

#ifdef _WIN32
#include <conio.h>
#else
#include <stdio.h>
#define clrscr() printf("\e[1;1H\e[2J")
#endif

Затем просто вызовите clrscr(). В Windows он будет использовать conio.h clrscr(), а в Linux он будет использовать escape-коды 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

Ответ 9

Окна:

system("cls");

Unix:

system("clear");

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

С этим вы легко достигаете переносимости.

Ответ 10

просто введите clrscr(); функция в void main().

в качестве примера:

void main()
{
clrscr();
printf("Hello m fresher in programming c.");
getch();
}

clrscr();

функция легко очищается.

Ответ 11

Правильный способ сделать это - использовать функции tput или terminfo для получения свойств терминала, а затем вставить новые строки в соответствии с размерами.

Ответ 12

Это должно сработать. Затем просто вызовите 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");
    }
}