你如何清除C中的控制台屏幕?

时间:2010-02-27 15:10:42

标签: c windows console console-application

除了使用system("cls")之外,还有一种“正确”的方式来清除C中的控制台窗口吗?

13 个答案:

答案 0 :(得分:25)

printf("\e[1;1H\e[2J");

此功能适用于ANSI终端,需要POSIX。我假设有一个版本可能也适用于窗口的控制台,因为它也支持ANSI转义序列。

#include <unistd.h>

void clearScreen()
{
  const char *CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
  write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 12);
}

还有其他一些 alternatives,其中一些不会将光标移动到{1,1}。

答案 1 :(得分:24)

好吧,C不懂屏幕的概念。因此任何代码都无法移植。也许看看conio.hcurses,根据您的需求?

无论使用何种库,可移植性都是一个问题。

答案 2 :(得分:11)

在Windows(cmd.exe),Linux(Bash和zsh)和OS X(zsh)上测试的解决方法:

#include <stdlib.h>

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

答案 3 :(得分:10)

因为你提到cls,听起来好像你指的是windows。如果是这样,则this KB item具有将执行此操作的代码。我刚尝试过它,当我用下面的代码调用它时它起作用了:

cls( GetStdHandle( STD_OUTPUT_HANDLE ));

答案 4 :(得分:8)

#include <conio.h>

并使用

clrscr()

答案 5 :(得分: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
}

答案 6 :(得分:6)

为了便于携带,请尝试以下方法:

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

然后只需致电clrscr()。在Windows上,它将使用conio.h的{​​{1}},在Linux上,它将使用ANSI转义码。

如果真的想要“正确”地执行此操作,您可以消除中间人(clrscr()conio等),并且只需使用级别系统工具(为大规模代码转储做准备):

printf

答案 7 :(得分:5)

没有C便携式方法可以做到这一点。虽然像curses这样的各种游标操作库都相对便携。 conio.h可在OS / 2 DOS和Windows之间移植,但不适用于* nix变体。

“控制台”的整个概念是标准C范围之外的概念。

如果您正在寻找纯粹的Win32 API解决方案,Windows控制台API中没有单独的调用来执行此操作。一种方法是FillConsoleOutputCharacter 足够多的字符。或WriteConsoleOutput您可以使用GetConsoleScreenBufferInfo 找出足够多的字符。

您还可以创建一个全新的控制台屏幕缓冲区并制作当前的控制台屏幕缓冲区。

答案 8 :(得分:2)

视窗:

system("cls");

Unix:

system("clear");

您可以改为插入换行符,直到所有内容都滚动,看看here

通过这种方式,您可以轻松实现便携性。

答案 9 :(得分:1)

只需键入clrscr(); void main()中的函数。

例如:

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

clrscr();

功能易于清除屏幕。

答案 10 :(得分:1)

在Windows中,我犯了使用错误

system("clear")

但这实际上是针对Linux

Windows类型是

system("cls")

没有#include conio.h

答案 11 :(得分:0)

正确的方法是使用tputterminfo函数获取终端属性,然后根据维度插入换行符。

答案 12 :(得分:-2)

这应该有效。然后只需调用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");
    }
}