it-swarm.asia

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

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

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

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

有没有办法在检查输出之前保持打开状态,或者在窗口关闭后查看结果?

428
Martin

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

437
Tom

右键单击您的项目

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

SubSystem选项中选择 Console(/ SUBSYSTEM:CONSOLE) 或者您只需在文本字段中键入 Console

现在尝试一下......它应该有效

207
Viraj

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

#include <stdlib.h>

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

将它放在程序的顶部,如果它在Windows系统(#ifdef _WIN32)上,那么它将创建一个名为WINPAUSE的宏。每当您希望程序暂停时,请调用WINPAUSE;,它将使用DOS命令暂停程序。对于像Unix/Linux这样的其他系统,控制台不应该在程序退出时退出。

45
Shaun

转到调试菜单 - > StartWithoutDebugging

26
pashaplus

如果您使用的是.NET,请在程序结束前输入Console.ReadLine()

它将等待<ENTER>

22
Cheeso

(/ SUBSYSTEM:CONSOLE)对我的vs2013没用(我已经有了)。

“run without debugging”不是一个选项,因为我不想在调试和看到输出之间切换。

我结束了

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

在qtcreator pre 2.6中使用的解决方案。现在,当qt正在增长时,vs正在走向另一条路。我记得在vs2008中我们不需要这样的技巧。

12
fantastory

尝试在getchar()返回之前调用main()

12
Magarusu

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

  1. 创建批处理文件。我打电话给我的runthenpause.bat,内容如下:

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

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

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

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

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

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

7
cxw

把它作为你的最后一行代码:

system("pause");
6
RefaelJan

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

如果这不起作用,那么将以下内容添加到代码的末尾:

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

这等待您在代码到达结束后按一个键关闭终端窗口。

如果要在多个位置执行此操作,请将上述代码放在方法(例如private void Pause())中,并在程序到达可能的末尾时调用Pause()

3
carefulnow1

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

3
theambient

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

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

来自 Visual Studio文档的相应片段

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

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

3
chronoxor

您可以从命令提示符运行可执行文件。这样你就可以看到所有输出。或者,你可以做这样的事情:

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

return YOUR_MAIN_CODE;

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

3
Geo

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

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

一个更好的解决方案:

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

在你的程序的开头。

优点:

  • 可以使用std :: exit()
  • 可以从main获得多个回报
  • 你可以在调试器下运行你的程序
  • IDE独立(如果使用cin.sync(); cin.ignore();技巧而不是system("pause");,则独立于操作系统)

缺点:

  • 必须修改代码
  • 不会在std :: terminate()上暂停
  • 仍将在IDE /调试器会话之外的程序中发生;您可以使用以下命令阻止此操作:

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

使用:

  1. cin.get();

要么

  1. system("pause");

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

2
AAEM

您也可以使用此选项

#include <conio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
   .
   .
   .
   getch(); 

   return 0;
}
1
Vladimir Salguero