Windows-如何清除C中的控制台屏幕?
除了使用system("cls")之外,是否还有“适当”的方法来清除C中的控制台窗口?
12个解决方案
26 votes
printf("\e[1;1H\e[2J");
此功能将在ANSI终端上工作,需要POSIX。 我假设有一个版本也可以在窗口的控制台上使用,因为它还支持ANSI转义序列。
#include
void clearScreen()
{
const char *CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 12);
}
还有一些替代方案,其中某些方案不会将光标移至{1,1}。
Avinash Katiyar answered 2020-02-02T13:49:13Z
24 votes
好吧,C不理解屏幕的概念。 因此,任何代码都无法移植。 也许看看conio.h或诅咒,根据您的需要?
无论使用什么库,可移植性都是一个问题。
Tom answered 2020-02-02T13:48:48Z
11 votes
在Windows(cmd.exe),Linux(Bash和zsh)和OS X(zsh)上测试过的变通办法:
#include
void clrscr()
{
system("@cls||clear");
}
Jamesits answered 2020-02-02T13:49:33Z
10 votes
由于您提到cls,所以听起来您是在指Windows。 如果是这样,则此KB项具有将执行此操作的代码。 我只是尝试过,当我用以下代码调用它时,它就起作用了:
cls( GetStdHandle( STD_OUTPUT_HANDLE ));
Mark Wilkins answered 2020-02-02T13:49:53Z
10 votes
使用宏可以检查您是否在Windows,Linux,Mac或Unix上,并根据当前平台调用相应的函数。 如下所示:
void clear(){
#if defined(__linux__) || defined(__unix__) || defined(__APPLE__)
system("clear");
#endif
#if defined(_WIN32) || defined(_WIN64)
system("cls");
#endif
}
nbro answered 2020-02-02T13:50:14Z
8 votes
#include
和使用
clrscr()
Vivek Sharma answered 2020-02-02T13:50:33Z
8 votes
为了便于携带,请尝试以下操作:
#ifdef _WIN32
#include
#else
#include
#define clrscr() printf("\e[1;1H\e[2J")
#endif
然后只需调用conio。在Windows上,它将使用printf的clrscr(),在Linux上,它将使用ANSI转义码。
如果您真的想“适当地”执行此操作,则可以消除中间商(conio、printf等),而仅使用低级系统工具(准备进行大规模代码转储)即可:
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include
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
#include
void ClearScreen()
{
if (!cur_term)
{
int result;
setupterm( NULL, STDOUT_FILENO, &result );
if (result <= 0) return;
}
putp( tigetstr( "clear" ) );
}
#endif
MD XF answered 2020-02-02T13:51:03Z
5 votes
没有C可移植的方式来执行此操作。 尽管像curses之类的各种光标操作库都是相对可移植的。 conio.h可在OS / 2 DOS和Windows之间移植,但不能移植到* nix变体。
“控制台”的整个概念是超出标准C范围的概念。
如果您正在寻找纯Win32 API解决方案,则Windows控制台API中没有单个调用可以执行此操作。 一种方法是填充足够多的字符的FillConsoleOutputCharacter。 或WriteConsoleOutput您可以使用GetConsoleScreenBufferInfo找出多少个字符就足够了。
您还可以创建一个全新的控制台屏幕缓冲区,并使其成为当前的屏幕缓冲区。
John Knoeller answered 2020-02-02T13:51:37Z
2 votes
视窗:
system("clear");
Unix:
system("clear");
您可以改为插入换行符,直到所有内容滚动为止,在这里看看。
这样,您便可以轻松实现可移植性。
gfe answered 2020-02-02T13:52:19Z
1 votes
只需输入clrscr(); 在void main()中起作用。
例如:
void main()
{
clrscr();
printf("Hello m fresher in programming c.");
getch();
}
clrscr();
功能易于清除屏幕。
Fridoon answered 2020-02-02T13:52:48Z
0 votes
正确的方法是使用tput或terminfo函数获取终端属性,然后根据尺寸插入换行符。
Jack answered 2020-02-02T13:53:08Z
-2 votes
这应该工作。 然后只需调用cls(); 每当您想清除屏幕时。
(使用之前建议的方法。)
#include
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");
}
}
JD3 answered 2020-02-02T13:53:33Z