为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在C和C ++中应避免使用system()函数?

/ 猿问

为什么在C和C ++中应避免使用system()函数?

C++ C
狐的传说 2019-11-19 14:37:53

我在论坛上看到很多人都在回避该system()功能,例如system("cls")。我不明白为什么。

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


查看完整描述

3 回答

?
一只名叫tom的猫

这里有多个问题:

  • 首先,system()作为一个功能是跨平台的,不仅在Windows或Linux上可用。但是,实际调用的程序可能取决于平台。例如,您可以system()用来创建目录:system("md Temp")。这仅适用于Windows,因为Linux不知道名为的命令md。对于Linux,它必须是system("mkdir Temp")。这种情况持续发生,因此您需要为每个平台使用自定义解决方案。

  • 这将始终产生一个子进程,然后该子进程将执行某些操作。通常,这比某些内联代码要慢,例如,必须加载命令或程序,加载其自身的依赖项,然后必须执行等等,这通常需要做很多工作。

如果您只是在一个平台上进行一些快速测试,则使用它system()是很好的选择,但除非真正需要,否则不要在生产环境中使用它。例如,您可以允许用户设置一个外部程序,然后执行该程序。对于这样的事情system()是完全可以的。


查看完整回答
反对 回复 2019-11-19
?
白衣染霜花

关于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();


查看完整回答
反对 回复 2019-11-19
?
陪伴而非守候

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


这些呼叫不是可移植的,它们可能无法在其他平台上运行。

这些电话的通话费用昂贵,为什么您要让资源被吃光?

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


查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信