21

我在论坛上看到很多人告诉避免使用该system()功能,例如system("cls"). 我不明白为什么。

请告诉我为什么我应该避免这个功能。而且,由于clrscr()不能与 CodeBlocks 一起使用,还有哪些其他方法可以在不使用该system()功能的情况下清除屏幕?

4

3 回答 3

29

这里有多个问题:

  • 首先,system()作为一个功能是跨平台的,不仅在 Windows 或 Linux 上可用。但是,实际调用的程序可能取决于平台。例如,您可以使用system()创建目录:system("md Temp"). 这仅适用于 Windows,因为 Linux 不知道名为md. 对于 Linux,它必须是system("mkdir Temp"). 这种情况会持续下去,因此您需要为每个平台定制一个解决方案。
  • 这将始终产生一个子进程,然后执行某些操作。这通常会比一些内联代码慢,例如必须加载命令或程序,加载它自己的依赖项,然后必须执行等等,这通常需要更多的工作。

如果您只是在一个平台上进行一些快速测试,那么使用system()非常好,但您不应该在生产环境中使用它,除非您真的必须这样做。例如,您可以允许用户设置然后执行的外部程序。对于这样system()的事情非常好。

于 2013-11-11T18:50:51.733 回答
4

有一个关于system()使用的答案。并且没有标准的 C++ 方法来清除控制台窗口。对于 Windows 平台,您可以使用这样的代码:

void clear() 
{
    COORD startPos  = { 0, 0 };
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;

    GetConsoleScreenBufferInfo(hConsole, &screen);
    FillConsoleOutputCharacterA(hConsole, ' ', screen.dwSize.X * screen.dwSize.Y, startPos, &written);
    FillConsoleOutputAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE, screen.dwSize.X * screen.dwSize.Y, startPos, &written);
    SetConsoleCursorPosition(hConsole, startPos);
}

而对于 linux,从未尝试过,但找到了方法:

#include <curses.h>
erase();
于 2016-06-15T10:52:31.960 回答
1

您应该避免系统调用,因为

  • 这些调用不可移植,它们可能无法在其他平台上运行。
  • 那些电话打起来很贵,你为什么要让你的资源被吃掉?

如何清除控制台?您可以使用std::cout << std::string(50, '\n');

于 2013-11-11T18:50:58.000 回答