这是一个我不太明白的问题:
命令system("pause");
被教给新程序员,作为暂停程序并等待键盘输入继续的方法。然而,许多资深程序员似乎不赞成这种不应该做的事情。
有些人说使用它很好。有人说这只是在你被锁在你的房间而没有人在看的时候使用。有人说,如果你使用它们,他们会亲自到你家里杀了你。
我,我自己是一名没有正式编程培训的新程序员。我使用它是因为我被教导使用它。我不明白的是,如果它不是可以使用的东西,那么我为什么要教它使用它?或者,另一方面,它毕竟不是那么糟糕吗?
您对此主题有何看法?
答案 0 :(得分:74)
这令人不满,因为它是一个特定于平台的黑客,与实际学习编程无关,而是绕过IDE / OS的一个功能 - 当程序执行完毕后,从Visual Studio启动的控制台窗口关闭,所以新用户无法看到他的新程序的输出。
在系统中阻止(“暂停”)运行Windows命令行“暂停”程序,并在继续执行程序之前等待终止程序 - 控制台窗口保持打开状态,以便您可以读取输出。
更好的想法是在最后放置一个断点并对其进行调试,但这又有问题。
答案 1 :(得分:35)
这很慢。它取决于平台。这是不安全的。
第一:它的作用。调用“system”就像在Windows命令提示符下键入命令一样。您的应用程序会进行大量的设置和拆卸以进行此类调用 - 而且开销非常荒谬。
如果将一个名为“pause”的程序放入用户的PATH怎么办?只是调用系统(“暂停”)只能保证执行一个名为“pause”的程序(希望你没有名为“pause”的可执行文件!)
只需编写自己的“暂停()”函数即可使用_getch。好的,确定,_getch也是平台相关的(注意:它在“conio.h”中定义) - 但是如果你在Windows上开发并且它具有相同的效果(虽然它是你的)它比system()
好得多有责任提供cout左右的文本。)
基本上:当你只需添加两行代码和一个包含并获得更灵活的机制时,为什么会引入这么多潜在的问题呢?
答案 2 :(得分:24)
一个简单的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
通常不被视为调用其他程序的好方法 - 通常最好使用CreateProcess
或fork
或类似的东西。
答案 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;
之后,您将点击一个空白字符cin
或cin
。 Enter
会忽略此字符并将其保留在缓冲区中,但是\n
会保留此字符。因此,程序的控制到达了cin
行,并且在您看到结果之前控制台已关闭。
为了解决这个问题,我们编写如下代码:
cin.get()
答案 11 :(得分:-1)
专业人士使用系统(“PAUSE”);创建程序的一小部分是为了自己调试。如果您使用它来获取变量的结果,那么在您用于确保它们正常工作的每个过程之前和之后。
经过测试并将其与其余解决方案全面展开后,您应该删除这些线条。在测试用户定义的算法并确保按照正确的顺序处理所需的结果时,它确实很好。
在您测试并确保它正常工作后,您绝不想在应用程序中使用它。但它确实允许您跟踪发生的所有事情。不要将它用于最终用户应用程序。
答案 12 :(得分:-3)
这都是风格问题。它对调试很有用,但不应该在程序的最终版本中使用。在内存问题上这无关紧要,因为我确信发明系统的那些人(“暂停”)预计会经常使用它。从另一个角度来看,计算机会因为我们在计算机上使用的其他所有内容而限制其内存,并且它不会像动态内存分配那样构成直接威胁,所以我建议它用于调试代码,但没有别的。