【问题标题】:Is clrscr(); a function in C++?是 clrscr(); C++ 中的函数?
【发布时间】:2025-12-08 02:40:01
【问题描述】:

我到处寻找这个函数,但找不到头文件来使它工作。 它说 clrscr() undeclared 这让我想到了这个问题。是 clrscr(); C++ 中的函数?

【问题讨论】:

  • 我的一位 C 老师(正式的 C++ 老师)曾经给我们一个 C 头文件,定义了这种方法,使用 WinAPI 调用实现。他从不花时间解释它不是任何标准库的一部分,因此他总是会收到无法在家里编译他的示例的学生的问题。他也是的粉丝。啊啊回忆...
  • 你有没有弄清楚我的男人? :)

标签: c++


【解决方案1】:

它曾经是 中的一个函数,在旧的 Borland C 编译器中。

它不是 C++ 标准函数。

【讨论】:

  • 其实微软C++还是有conio.h的,虽然没有clrscr()之类的函数。
【解决方案2】:

在有人发布通常的“请给我发送 conio.h 文件”请求之前,我可以指出这个古老的 Borland 头文件只包含函数的声明。您还需要支持 Borland 库,它与任何现代 C++ 编译系统都不兼容。

【讨论】:

  • 这不应该阻止人们!他们可以从库中反汇编函数,并在通过内联汇编执行它的头文件中插入一个定义!
【解决方案3】:

如前所述,clrscr() 来自 turbo c++,在 conio.h 中

出于所有意图和目的,conio.h 是“非标准的”,因此应该避免使用。

我倾向于使用预编译器来选择使用什么来做一个简单的清屏,然后调用操作系统的清屏程序......它足够聪明,知道屏幕有多“高”。

// somewhere in the program
#define WINDOWS 1

void console_clear_screen() {
  #ifdef WINDOWS
  system("cls");
  #endif
  #ifdef LINUX
  system("clear");
  #endif
}

在 windows 中,您可能需要查看 windows.h,您可以使用“句柄”直接与 windows 控制台交互,通常在代码中标注为 hWin。

在 linux 中,我对 curses/ncurses 很幸运,虽然一开始有点令人困惑。

更新调用系统程序 (clear.exe?) 是一个潜在的安全风险 - 如果有人能够通过其他途径以某种方式劫持系统调用,他们可能会迫使你的程序做一些奇怪的事情.我的建议是深入了解您平台的控制台 api 来完成这些事情。

【讨论】:

  • #define 不是小写的吗?编译器也会为你定义WINDOWS或LINUX,不是吗?
  • 我不知道define是否区分大小写。通常,该定义通过 windows.h 包含为“win32”,这只是一个示例。
  • 我认为是,除非你先#define DEFINE 定义
【解决方案4】:

你必须为这个函数包含这个头文件

#include <conio.h>

【讨论】:

  • 使用后来的 C++?我不这么认为:D
【解决方案5】:

网络搜索显示您想要的头文件是 'conio.h' - 我还没有尝试过,所以不能保证。它的存在也可能取决于您编译的平台。

【讨论】:

    【解决方案6】:

    您可以使用系统 cls 命令清除输出屏幕..

    clrscr() 来自 turbo c++,在 conio.h 和 conio.h 中是“非标准的”,因此应该避免使用。 例子

        #include<windows.h>
        main()
        {
        some code....;
        system("cls");
        some more code;
        }
    

    它经过测试并且可以工作.. 我使用带有 mingw 编译器的 dev c++.. :)

    【讨论】:

      【解决方案7】:

      在 Linux 上我总是使用:

      void clrscr(void)
      {
         fprintf(stdout, "\033[2J"); // clean screen
         fprintf(stdout, "\033[1;1H"); // move cursor to the first line
      }
      

      【讨论】:

      • 如果您阅读clear 的源代码,您会发现它实际上是查找终端的类型并为该终端发出适当的输出,而不是假设整个世界都是一个VT100。我将把它作为练习留给读者,以了解应该在可移植程序中完成哪些操作。
      【解决方案8】:

      在真正的 C++ 中清除屏幕的最简单方法是发送一堆空白行。当然这是假设 stdout 指向屏幕而不是文件:

      for (int i = 0; i < 80; ++i)
           cout << "\n";
      cout << endl;
      

      【讨论】:

      • 它还假设控制台行缓冲区少于80行,这是不保证的。
      • 是的 - 但如果您担心“清除”屏幕缓冲区,通常您会知道要处理多少行。
      • 混合“endl”和“\n”看起来很奇怪。为什么要这样做?清除屏幕知道行数的假设似乎很荒谬; “clear”或“cls”命令不占用要清除的行数,是吗?其他选项也会将光标设置在左上角,而您的解决方案会将光标留在左下角——并用大量空行填充用户的后滚动条。
      【解决方案9】:

      我以前也做borland。

      调查诅咒是个好主意。它适用于许多 unix 平台。

      您可以在 source forge 中查看nconio

      This 看起来也很有希望。

      【讨论】:

        【解决方案10】:

        在类 Unix 系统上,您可以使用 VT100 转义码。

        std::cout << "\033[2J" << std::flush;
        

        http://www.termsys.demon.co.uk/vtansi.htm

        【讨论】: