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

时间:2009-07-10 04:32:17

标签: c++

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

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

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

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

您对此主题有何看法?

13 个答案:

答案 0 :(得分:74)

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

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

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

答案 1 :(得分:35)

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

第一:它的作用。调用“system”就像在Windows命令提示符下键入命令一样。您的应用程序会进行大量的设置和拆卸以进行此类调用 - 而且开销非常荒谬。

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

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

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

答案 2 :(得分:24)

  • 慢:它必须跳过很多 不必要的Windows代码和 单独的程序,简单 操作
  • 不便携:依赖于 暂停计划
  • 不好的风格: 进行系统调用应该只是 当真的必要
  • 时完成
  • 更 输入:系统(“暂停”)更长 比getchar()

一个简单的getchar()就可以了。

答案 3 :(得分: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") 或任何其他等待命令 { {1}},是上面的第一点:它完全是不必要的,它完全没有用处,它只是非常愚蠢。

答案 4 :(得分:18)

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

this文章中的进一步说明。

答案 5 :(得分: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。它依赖于平台,实际上调用了一个“虚拟”操作系统。

答案 6 :(得分:9)

因为它不便携。

pause

是一个仅限windows / dos的程序,所以你的代码不会在linux上运行。此外,system通常不被视为调用其他程序的好方法 - 通常最好使用CreateProcessfork或类似的东西。

答案 7 :(得分:4)

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

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

valu.push(val);

是错误的,因为它是Windows API的一部分,因此无法在其他操作系统中使用。

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

function findLongestWordLength(str) {
  let val = 0;
  let valu = [];

  // Make an array contain every word length 
  for (let i = 0; i < str.length; i++) {
    let a = str.split("")[i];

    if (a == " ") {
      valu.push(val);
      val = 0;
    } else {
      val++;
    }

    console.log(i);
  }

  // Add this line to add the last value "val".
  valu.push(val);

  val = 0;

  // Search for the max value 
  for (let i = 0; i < valu.length; i++) {
    if (valu[i] > val) {
      val = valu[i];
    }
  }

  return val;
}

但是如果您的代码中还有其他system("pause"); ,也会引起问题。因为在每个cin.get(); return 0; 之后,您将点击一个空白字符cincinEnter会忽略此字符并将其保留在缓冲区中,但是\n会保留此字符。因此,程序的控制到达了cin行,并且在您看到结果之前控制台已关闭。
为了解决这个问题,我们编写如下代码:

cin.get()

答案 11 :(得分:-1)

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

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

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

答案 12 :(得分:-3)

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