防止在Visual Studio C / C ++控制台应用程序上关闭控制台窗口


464

这无疑是一个令人尴尬的问题,因为答案无疑是显而易见的。

我已经使用Visual Studio多年了,但这是我第一次完成任何“控制台应用程序”开发。

当我运行应用程序时,会弹出控制台窗口,出现程序输出,然后在应用程序退出时关闭窗口。

有没有办法让它保持打开状态直到我检查输出,或者在关闭窗口后查看结果?


Monodevelop可以满足您的期望。
ctrl-alt-delor

3
下面有太多答案,所以我在这里复制答案:如果您使用的是VS2017,则工具->选项->调试->自动关闭控制台
jw_

同意 我认为VS 2017和更高版本的最佳答案是chronoxor。
所有的愤怒

Answers:


466

如果运行时没有调试(Ctrl + F5),则默认情况下会提示您按回车键以关闭窗口。如果要使用调试器,则应在最后一行放置一个断点。


268
如果您具有C ++应用程序并且“运行时无需调试”并且控制台窗口仍然关闭,则需要记住在“配置属性” /“链接器” /“系统”下将“子系统”显式设置为“控制台”。如果您从一个空项目开始,这会使子系统保持未设置状态,则可能会发生这种情况。
特雷弗·罗宾逊

4
不适用于我:(控制台窗口立即打开和关闭,但是日志暂停并等待再次按F5键
CodyBugstein 2013年

40
正确的答案是@TrevorRobinson的答案:如果您无法确定配置属性的位置,请使用以下扩展版本:在Visual Studio中的项目上单击鼠标右键>“属性”>“配置属性”>“链接器”>“系统”,将“子系统”更改为“控制台”
PlagueHammer 2014年

3
特雷弗·罗宾逊(Trevor Robinson)是对的。如果启动一个空白项目,则为C ++项目。您需要转到视图->属性管理器->属性(扳手图标)->配置。在弹出菜单的“属性”->“链接器”->“系统”->“子系统”->中,选择“控制台”。
最受尊敬的先生,

10
我在VS community 2017上ctrl+f5工作。不起作用,Properties当我右键单击项目时没有,这wrench icon也是灰色的。
Ketan

232

右键点击您的项目

属性>配置属性>链接器>系统

在选项中选择控制台(/ SUBSYSTEM:CONSOLE)SubSystem或者您只需在文本字段中输入控制台即可!

现在尝试...它应该可以工作


这适用于我的VS2013 Express,但没有被接受的答案。非常奇怪,因为接受的答案已经适用于我过去使用的所有Visual Studio版本。
Michael Calvin

9
@MichaelCalvin设置此选项后,必须使用Ctrl + F5来运行,这就是启动程序。
乔纳森·梅

正如@JonathanMee所说,您仍然需要运行Ctrl + F5。这已经在我的visual studio 2015中设置了,因此第一个答案是最有用的答案。

这确实是正确的。CTRL+F5例如,如果您将一个新的C ++文件添加到一个空项目中,熟悉的人将失败。
user2023370

在Visual Studio Express 2015上为我工作。谢谢。
LHC

44

这是C / C ++的一种方法:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

将其放在程序的顶部,如果它在Windows系统(#ifdef _WIN32)上,则它将创建一个名为的宏WINPAUSE。每当您希望程序暂停时WINPAUSE;,使用DOS命令进行调用,它将使程序暂停。对于Unix / Linux之类的其他系统,无论如何,控制台都不应在程序退出时退出。


此方法在Visual C ++中不起作用(除非您包含一些标头?)
wmac

2
@wmac您必须包括windows.h标头
Geowil,2016年

1
我没有包含任何库或名称空间,但可以正常运行,非常感谢。
HalilİbrahimOymacı16年

1
请不要那样做。该pause命令是Windows特定的。
firegurafiku

在Visual Studio 2013 Express上为我工作。:)
Anirban

32

转到Debug菜单-> StartWithoutDebugging


除非选择了C#开发环境,否则在VS 2008中这甚至不是选项。CTRL + F5可以。您也可以通过工具>自定义将此按钮添加为工具栏上的按钮。
佩里2015年

如果您有多个项目,请将相关项目设置为启动项目
CAD bloke 2015年

27

如果使用的是.NET,请将其放在Console.ReadLine()程序末尾。

它将等待<ENTER>


9
+1-要么Console.ReadKey()只是等待任何键。
FredrikMörk09年

很奇怪,这对我的应用没有影响。它仍然关闭而无需等待用户输入。
Kokodoko

4
然后,您的代码很可能在到达该点之前退出。
实际上是

20

从Visual Studio 2017(15.9.4)开始,有一个选项:

Tools->Options->Debugging->Automatically close the console

Visual Studio文档中的相应片段:

调试停止时自动关闭控制台:

告诉Visual Studio在调试会话结束时关闭控制台。


2
我刚刚在VS2017和VS2019中对此进行了测试。它需要将子系统设置为CONSOLE并关闭此选项。拥有一个或另一个或两个都不自动关闭窗口。
Casey

如果我从同一解决方案启动多个项目,这仍为我关闭窗口。
Serge Rogatch

我觉得这是VS 2017及更高版本的正确答案。太糟糕了,它不在较旧的版本中。
所有的愤怒

13

尝试getchar()main()返回之前立即致电。


对于简单的Hello Name控制台应用程序,在VS 2008中不起作用。cout,cin,cout,getchar(),控制台仍然关闭。这是怎么回事?
佩里2015年

1
如果在getchar()之前有提示,请尝试两次放置getchar()。getchar()需要一个char,并且您已经在使用cout了...让我知道这是否有帮助:)
Magarusu 2015年

12

(/ SUBSYSTEM:CONSOLE)不适用于我的vs2013(我已经拥有了)。

“不调试运行”不是一个选项,因为我不想在调试和查看输出之间切换。

我以

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

在qtcreator 2.6之前的版本中使用的解决方案。现在,尽管qt不断增长,vs却朝着其他方向发展。我记得,在vs2008中,我们不需要这些技巧。


7

这是一个解决方案,该解决方案(1)不需要任何代码更改或断点,并且(2)在程序终止后暂停以便您可以看到所有已打印的内容。在F5或Ctrl + F5之后,它将暂停。主要缺点是在VS2013 Express(经测试)上,它不会加载符号,因此调试非常受限制。

  1. 创建一个批处理文件。我称我为runthenpause.bat,内容如下:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause

    第一行将运行您提供的任何命令以及最多八个参数。第二行将...暂停。

  2. 打开项目属性| 配置属性| 调试。

  3. 将“命令参数”更改为$(TargetPath)(或“命令”中的任何内容)。
  4. 将“命令”更改为的完整路径runthenpause.bat
  5. 点击确定。

现在,当您运行时,runthenpause.bat将启动您的应用程序,并且在您的应用程序终止后,将暂停以供您查看控制台输出。

如果我弄清楚如何加载符号,我将发布更新。我为此尝试/Z7,但没有成功。


1
这仍然不支持调试,但是与其他所有答案相比,它至少解决了无法查看VLD输出的问题。
马丁·亨宁斯


3

您可以从命令提示符下运行可执行文件。这样,您可以看到所有输出。或者,您可以执行以下操作:

int a = 0;
scanf("%d",&a);

return YOUR_MAIN_CODE;

这样,在您输入a变量数据之前,窗口不会关闭。


3

添加“ |” 在项目属性的调试部分下的命令参数框中,单击“暂停”。


4
如果可行,这将是一个很好的解决方案。 pause似乎仅适用于批处理文件,并且在STDIN上从程序接收输入时,它不会重新打印该文本。我试图替换|&&,但它没有任何效果-大概是因为它不与命令行shell(CMD.EXE)执行。
布莱恩·范登堡

3

只需按CNTRL + F5即可在外部命令行窗口中将其打开(Visual Studio无法对其进行控制)。

如果这不起作用,则在代码末尾添加以下内容:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

一旦代码到达末尾,这将等待您按一个键以关闭终端窗口。

如果要在多个位置执行此操作,请将上面的代码放入方法(例如private void Pause())中,并Pause()在程序可能结束时进行调用。


当我执行cntrl + f5时,它将打开然后立即关闭?您如何解决?
卡勒特

第二个解决方案是我想要的!
RoG

当我按Ctrl + F5时,没有任何反应。它曾经为我工作,但突然间,它停止了工作。
Natasha

2

更好的解决方案:

atexit([] { system("PAUSE"); });

在程序开始时。

优点:

  • 可以使用std :: exit()
  • 可以从主获得多个收益
  • 您可以在调试器下运行程序
  • 独立于IDE(如果使用cin.sync(); cin.ignore();技巧而不是,则独立于+ OS system("pause");

缺点:

  • 必须修改代码
  • 不会在std :: terminate()上暂停
  • 仍然会在您的程序中发生在IDE /调试器会话之外;您可以使用以下方法在Windows下防止这种情况:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}

非常糟糕的建议。
干杯和健康。-Alf

你能详细说明为什么吗?
GhassanPL

在不进行调试的情况下,它没有任何用处,因为在这种情况下,没有要解决的问题。在VS中,只需使用Ctrl + F5运行程序即可,因此VS中没有问题,在命令解释器中也没有问题,总之,没有问题。而且在有人正在调试并且想要停止的情况下,添加代码来停止不是比断点更方便的解决方案,并且会干扰人们不希望停止的情况。
干杯和健康。-Alf

2

可以使用:

  1. cin.get();

要么

  1. system("pause");

确保在main()函数的末尾和return语句之前创建它们。



2

就我而言,我在VS 2017社区版上创建了一个Empty C ++项目时就遇到了这种情况。您将需要在“配置属性”下将“子系统”设置为“控制台(/ SUBSYSTEM:CONSOLE)”。

  1. 转到“查看”,然后选择“属性管理器”
  2. 右键单击项目/解决方案,然后选择“属性”。这将打开“测试”属性页面
  3. 导航到链接器,然后选择“系统”
  4. 点击“子系统”,出现一个下拉菜单
  5. 选择“控制台(/ SUBSYSTEM:CONSOLE)”
  6. 申请并保存
  7. 下次使用“ CTRL + F5”运行代码时,应该会看到输出。

0

Visual Studio 2015,带有导入。因为我讨厌代码示例没有提供所需的导入。

#include <iostream>;

int main()
{
    getchar();
    return 0;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.