系统(“暂停”); - 为什么这是错的?

问题描述 投票:116回答:12

这是一个我不太明白的问题:

命令system("pause");被教给新程序员,作为暂停程序并等待键盘输入继续的方法。然而,许多资深程序员似乎不赞成这种不应该做的事情。

有人说使用起来很好。有人说这只是在你被锁在你的房间而没有人在看的时候使用。有人说,如果你使用它们,他们会亲自到你家里杀了你。

我,我自己是一名没有正式编程培训的新程序员。我使用它是因为我被教导使用它。我不明白的是,如果它不是可以使用的东西,那么我为什么要教它使用它?或者,另一方面,它毕竟不是那么糟糕吗?

你对这个问题有什么看法?

c++
12个回答
74
投票

它不受欢迎,因为它是一个特定于平台的黑客,与实际学习编程无关,而是绕过IDE / OS的一个功能 - 从Visual Studio启动的控制台窗口在程序执行完毕后关闭,等等新用户无法看到他的新程序的输出。

系统中的阻止(“暂停”)运行Windows命令行“暂停”程序,并在继续执行程序之前等待终止程序 - 控制台窗口保持打开状态,以便您可以读取输出。

更好的想法是在最后放置一个断点并对其进行调试,但这又有问题。


0
投票

这是你不应该使用它的一个原因:如果你将程序传递给另一台机器,它将会破坏在Windows上运行的大多数反病毒程序,因为这是一个安全威胁。即使你的程序只包含一个简单的cout << "hello world\n"; system("pause");它的资源很重,程序也可以访问cmd命令,这些反病毒看作是威胁。


0
投票
system("pause");  

是错误的,因为它是Windows API的一部分,所以它不能在其他操作系统中工作。

您应该尝试仅使用C ++标准库中的对象。更好的解决方案是写:

cin.get();
return 0;

但如果您的代码中有其他cins,它也会导致问题。因为在每个cin之后,你将点击Enter\n,这是一个白色空间角色。 cin忽略了这个角色并将其留在缓冲区,但cin.get(),得到了这个仍然存在的角色。所以程序的控制到达行return 0并且控制台关闭然后让你看到结果。 为了解决这个问题,我们编写如下代码:

cin.ignore();  
cin.get();  
return 0;

-1
投票

专业人士使用系统(“PAUSE”);创建程序的一小部分是为了自己调试。如果您在每个进程的使用期间和之后使用它来获取变量的结果,那么您将使用它来确保它们正常工作。

经过测试并将其与其余解决方案全面展开后,您应该删除这些线。在测试用户定义的算法并确保按照正确的顺序处理所需的结果时,它确实很好。

在您测试并确保它正常工作后,您决定不想在应用程序中使用它。但它确实允许您跟踪发生的所有事情。根本不要将它用于最终用户应用程序。


-3
投票

这都是风格问题。它对调试很有用,但不应该在程序的最终版本中使用。在内存问题上这无关紧要,因为我确信那些发明系统的人(“暂停”)预计会经常使用它。从另一个角度来看,计算机会因为我们在计算机上使用的其他所有内容而限制其内存,并且它不会像动态内存分配那样构成直接威胁,因此我建议将其用于调试代码,但没有别的。


35
投票

这很慢。它取决于平台。这是不安全的。

第一:它的作用。调用“system”就像在Windows命令提示符下键入命令一样。你的应用程序有大量的设置和拆解来进行这样的调用 - 而且开销很简单。

如果将一个名为“pause”的程序放入用户的PATH怎么办?只是调用系统(“暂停”)只能保证执行一个名为“pause”的程序(希望你没有名为“pause”的可执行文件!)

只需编写自己的“Pause()”函数即可使用_getch。好吧,确定,_getch也是平台相关的(注意:它在“conio.h”中定义) - 但是如果你在Windows上开发并且它具有相同的效果,它比system()好得多(尽管你有责任提供文字与cout左右)。

基本上:当你可以简单地添加两行代码和一个包含并获得更灵活的机制时,为什么会引入这么多潜在的问题?


24
投票
  • 慢:它必须跳过许多不必要的Windows代码和一个单独的程序来进行简单的操作
  • 不可移动:取决于暂停程序
  • 不好的风格:只有在真正需要的时候才能进行系统调用
  • 更多输入:系统(“暂停”)比getchar()更长

一个简单的getchar()应该做得很好。


20
投票

使用system("pause");是Ungood Practice™因为

  • 这完全没必要。 若要在Visual Studio中运行程序的控制台窗口时保持打开,请使用Ctrl + F5运行它而不进行调试,或者在}的最后一个右侧大括号main处放置一个断点。所以,在Visual Studio中没问题。当然,从命令行运行它时完全没问题。
  • 这是有问题和烦人的 从命令行运行该程序时。对于交互式执行,您必须在最后按一个键无任何目的。并且用于某些任务的自动化,pause非常不受欢迎!
  • 它不便携。 Unix-land没有标准的pause命令。

pause命令是一个内部cmd.exe命令,不能被覆盖,至少在另一个答案中错误地声称。即这不是一个安全风险,并且AV程序诊断它的说法与覆盖命令的声明一样可疑(毕竟,调用system的C ++程序能够完成命令解释器可以执行的任何操作,并且更多)。此外,虽然这种暂停方式在C ++编程的通常标准下效率极低,但在新手程序结束时根本不重要。

因此,在此之前答案的大部分声明是不正确的,并且你不应该在你的system("pause")结束时使用main或任何其他等待命令的主要原因是上面的第一点:它完全没必要,它绝对服务没有目的,这只是非常愚蠢。


18
投票

总之,当你使用像cin.get()这样简单的东西时,它必须暂停程序执行并进行系统调用并分配不必要的资源。人们使用系统(“PAUSE”),因为他们希望程序等到输入后才能看到输出。如果您希望程序等待输入,那么内置的功能也是跨平台且要求较低的功能。

this文章中的进一步解释。


14
投票

你可以使用std::cin.get()iostream

#include <iostream> // std::cout, std::cin
using namespace std;

int main() {
   do {
     cout << '\n' << "Press the Enter key to continue.";
   } while (cin.get() != '\n');

   return 0;
}

此外,system('pause')很慢,包括你可能不需要的文件:stdlib.h。它依赖于平台,实际上调用了一个“虚拟”操作系统。


9
投票

因为它不便携。

pause

是一个仅限Windows / DOS的程序,因此您的代码将无法在Linux上运行。此外,system通常不被认为是一种非常好的方式来称呼另一个程序 - 通常使用CreateProcessfork或类似的东西更好。


4
投票

如其他答案中所列,您可以找到许多原因来避免这种情况。这一切都归结为一个原因,使其余的没有实际意义。 System()函数本质上是不安全/不可信的,除非必要,否则不应将其引入程序。

对于学生作业,这种情况从未得到满足,因此如果调用此方法,即使没有运行程序,我也会失败。 (从一开始就明确了这一点。)


2
投票

对我来说,在没有理由退出之前等待一般是没有意义的。完成其工作的程序应该结束并将其资源交还给其创建者。

在一个工作日之后,一个人也没有默默地在黑暗的角落里等待,等待有人倾斜肩膀。

© www.soinside.com 2019 - 2024. All rights reserved.