【问题标题】:How do I clear the screen in C? [duplicate]如何在C中清除屏幕? [复制]
【发布时间】:2013-08-11 20:26:01
【问题描述】:

我想清除屏幕上的所有文本。 我试过使用:

#include <stdlib.h>
sys(clr);

提前致谢! 我正在使用 OS X 10.6.8。很抱歉造成混乱!

【问题讨论】:

  • 你使用的是什么操作系统?
  • 重复问题。请检查。
  • 我相信这个问题的答案将取决于您使用的操作系统。您需要编辑问题并告诉我们您使用的是哪个操作系统
  • 当您找到答案时,请考虑这样做是否明智。包括我在内的许多用户不喜欢程序随机清除屏幕,或者在我按下一个键但在我有机会确认这是我想通过按 输入。除非您使用的是实际的 TUI,否则这种事情是不必要的,而且通常很烦人。

标签: c macos unix


【解决方案1】:

您需要查看curses.h。它是一个终端(光标)处理库,它使所有支持的文本屏幕都以类似的方式运行。

共有三个发布版本,第三个 (ncurses) 是您想要的,因为它是最新的,并且被移植到大多数平台。 official website is here,there are a few good tutorials

#include <curses.h>

int  main(void)
{
     initscr();
     clear();
     refresh();
     endwin();
}

【讨论】:

  • 你为什么要投反对票,curses 是这样做的一种方式
  • 不确定是谁投了反对票,但 cursesa 方式,而不是 方式。
  • 这可能有资格作为评论,但绝对不是答案,也不太可能帮助 OP。也许如果你写了curses.h 是什么和/或他为什么要查看curses.h 那就更好了
  • 因此它是一个答案
  • 我添加了更多信息,供那些懒得上网的人参考。
【解决方案2】:

最好的清屏方式是通过stdlib.h中的system(const char *command)调用shell:

system("clear"); //*nix

system("cls"); //windows

再说一次,尽量减少对调用系统/环境的函数的依赖总是一个好主意,因为它们会导致各种未定义的行为。

【讨论】:

  • 太浪费了,你没有为此分叉一个完整的过程,为什么要引入竞争条件?
  • +1 给 Edwin 提出流程问题。
  • 你会怎么做?包含 ncurses 库在 IMO 中有点矫枉过正,一个“清晰”的过程几乎不会减慢大多数程序的速度。
  • 如果您认为添加库是多余的,请尝试运行程序。它添加了用于开发程序的所有库。此外,由于该程序是一个 shell,它会解释参数,在路径上查找程序,然后启动另一个程序。所有这些都是为了屏幕清晰? ncurses 是一个更好的选择,如果有人误入了“clear”或“cls”的流氓副本,或者有能力重新排序他们的路径,那么您不仅会引入安全漏洞。
  • 你可以通过不运行两个程序来完成一项工作来避免它。如果您决定使用此解决方案,那么您可以通过轮询操作系统来避免它,以确保在将任何进一步的文本写入屏幕之前清除程序已完全退出(这将需要在您的程序中进行写锁定)。这种“简单”的解决方案非常有问题,以至于修复起来并不简单。使用这个解决方案(由 Jim 记录)会花费您额外的 5 行代码,但不受这种竞争条件的影响,因为您的所有屏幕逻辑都在一个进程中。
【解决方案3】:

窗户:

system("cls"); // missing 's' has been replaced

Unix:

system("clear");

您可以将其包装在一个更便携的代码中,如下所示:

void clearscr(void)
{
#ifdef _WIN32
    system("cls");
#elif defined(unix) || defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))
    system("clear");
//add some other OSes here if needed
#else
    #error "OS not supported."
    //you can also throw an exception indicating the function can't be used
#endif
}

请注意,对 unix 的检查非常广泛。这也应该检测到您正在使用的 OS X。

【讨论】:

  • 使用系统调用 => 额外的进程。嗯.....
  • @Jim 好点,但这是最严肃的方式。在一个简单的控制台应用程序中,不时进行系统调用几乎不会成为性能问题。
  • 是的。我可以看到这两种解决方案是如何发挥作用的。
  • @edwinbuck 究竟是什么让这个不可移植?此外,无论您使用什么操作系统,stdlib.h 都是唯一需要包含的头文件,因此不需要预处理器逻辑。
  • @JSQuareD 您对标题包含的内容是正确的。我很抱歉。我在抱怨中要表达的部分是它假设了一个非常特殊的环境配置,虽然它是库存的,但在部署之后很容易修改。从这个意义上说,除非您可以在程序的整个生命周期内控制执行环境,否则它在功能上是没有保证的。在我看来不值得麻烦,但你是对的,源代码是可移植的。
【解决方案4】:

此函数或类似 clrscn() 之类的函数的可用性非常依赖于系统且不可移植。

您可以保持非常简单并自己动手:

#include <stdio.h>

    void clearscr ( void )
    {
      for ( int i = 0; i < 50; i++ ) // 50 is arbitrary
        printf("\n");
    }

【讨论】:

  • 这不是 C,而是 C++。这不会清除屏幕,只是用空行填充它。两个关键区别是光标最终位于 50 个空行的底部(而不是 (0,0)),并且可滚动缓冲区不会像清除屏幕时那样被擦除。
  • 它为我编译为 C。有用。大多数命令行程序不使用光标寻址。
  • 这就是你在VT终端之前的做法!
  • 这个实际上是唯一真正便携的解决方案。 (但在您的 TTY 上可能会花费大量纸张 ;-)
  • @DavidElliman:它编译为 C,因为您更改了它 =J。 cout &lt;&lt; 就像您最初拥有的那样不是 C,因为您不能在 C 中进行运算符重载。我关于它实际上没有清除屏幕的观点是您的光标留在了控制台的底部而不是顶部。这不仅仅是光标寻址的问题,这是一个非常明确的外观差异。当您清除屏幕并开始输入时,您希望它出现在第一行,而不是最后一行。在大多数情况下,它的功能可能相同,但对用户而言,它的外观和感觉却截然不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多