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

23 浏览
0 Comments

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

在论坛上,我看到很多人都建议避免使用system()函数,比如system(\"cls\")。我不明白为什么要这样做。\n请告诉我为什么我应该避免使用这个函数。还有,在CodeBlocks中clrscr()无法使用,有没有其他方法可以在不使用system()函数的情况下清屏?

0
0 Comments

system()函数在C和C++中应该避免使用,原因如下:

1. 这些调用不具备可移植性,可能在其他平台上无法正常工作。

2. 这些调用的开销很大,为什么要让资源被消耗?

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

"你需要包含一些头文件才能使用这些函数。" - 无论使用哪个库,这实际上是一个始终存在的问题。而且,只是打印大量换行符并不能保证正确清除屏幕。例如,在Windows下,现在大多数控制台窗口都有大约300行的缓冲区。

我已经删除了最后一个提示,你说的完全正确。

cout << string(300, '\n'); checkmate

你也希望刷新以确保吗?

:这将在滚动或将输出重定向到文件时在滚动缓冲区中创建300个空行。仍然不能保证使用这种方法非常优雅。

...并不是每个控制台都少于50行,而且控制台还有滚动条,即使输出足够多的行,你也会滚到底部而不是顶部。我将我的控制台配置为具有9999行(Windows上的最大可能值)。

正确,但即使是调用像clear这样的系统命令也不一定能保证正常工作。如果滚动窗口,内容将再次出现,不能真正保证其工作(尽管在一个环境中可能有效,在另一个环境中可能无法正常工作)。

不是的,在Windows上cls命令确实清除控制台并滚动到顶部。

0
0 Comments

在C和C++中应避免使用system()函数的原因是,它存在一些安全和性能方面的问题。system()函数可以用来执行操作系统命令,但它也会导致一些潜在的问题。

首先,system()函数的使用可能存在安全风险。因为它允许执行任意的命令,这就意味着如果输入的命令没有经过正确的验证和过滤,可能会导致命令注入攻击。攻击者可以利用这个漏洞执行恶意代码或者访问敏感信息。

其次,system()函数的性能较低。当调用system()函数时,它会创建一个新的进程来执行命令,并等待命令执行完毕后才返回。这个过程会消耗大量的系统资源和时间。如果需要频繁地执行系统命令,使用system()函数可能会导致程序的性能下降。

解决方法是使用替代的方法来执行系统命令,并避免使用system()函数。对于清空控制台窗口的操作,可以采用以下方法:

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

通过使用这些替代方法,可以提高程序的安全性和性能。避免使用system()函数可以减少潜在的安全漏洞,并避免不必要的资源消耗。

0
0 Comments

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

system()函数存在多个问题:

  • 首先,system()作为一个函数是跨平台的,不仅在Windows或Linux上可用。然而,被调用的实际程序可能是平台相关的。例如,你可以使用system()函数来创建一个目录:system("md Temp")。这只适用于Windows,因为Linux不知道一个叫做md的命令。在Linux上,应该使用system("mkdir Temp")。这样就需要为每个平台设计一个定制的解决方案。
  • 这将始终产生一个子进程来执行某些操作。这通常会比一些内联代码慢,例如命令或程序必须被加载,加载自己的依赖项,然后执行等等,这通常是更多的工作。

如果你只是在一个平台上进行一些快速测试,使用system()函数是完全可以的,但在生产环境中不应该使用它,除非你确实需要。例如,你可以允许用户设置一个外部程序,然后执行它。对于这种情况,system()函数是完全可以的。

此外,如果你对某个特定程序有依赖(例如用于显示结果),可能会更倾向于使用系统调用。

总结起来,应该避免在C和C++中使用system()函数的原因是:

1. system()函数需要为每个平台定制解决方案,不具备跨平台性。

2. 使用system()函数会生成一个子进程,执行起来通常较慢。

3. 在生产环境中,除非必要,应避免使用system()函数。

解决这个问题的方法是使用其他替代方案,例如使用特定平台的API函数或库来执行需要的操作,或者通过其他方式实现所需的功能,而不是依赖于system()函数的跨平台性和子进程的执行。

0