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

Posted

技术标签:

【中文标题】防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭【英文标题】:Preventing console window from closing on Visual Studio C/C++ Console application 【发布时间】:2010-12-19 01:15:19 【问题描述】:

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

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

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

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

【问题讨论】:

Monodevelop 符合您的预期。 【参考方案1】:

由于从 VS 运行它会附加 VS 调试器,因此您可以检查附加的调试器:

if (Debugger.IsAttached)

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

我想唯一需要注意的是,如果您附加任何其他调试器,它仍然会暂停,但这甚至可能是一种想要的行为。

【讨论】:

【参考方案2】:

有时,不会改变您的设置或代码的简单 hack 可以是:

按 F9 设置断点,然后按 F5 执行 Debug。

【讨论】:

【参考方案3】:

目前无法对在 WSL2 中运行的应用执行此操作。但是有两种解决方法:

    调试窗口保留关闭的 WSL shell 窗口的内容。

    如果您的应用程序返回非零返回码,则窗口保持打开状态,因此您可以在调试版本中返回非零值。

【讨论】:

【参考方案4】:

转到设置>调试>取消选中关闭结束。

【讨论】:

【参考方案5】:

右击你的项目

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

SubSystem选项中选择Console (/SUBSYSTEM:CONSOLE),或者您可以在文本字段中输入Console

现在试一试……应该可以了

【讨论】:

这适用于我的 VS2013 Express,但接受的答案没有。很奇怪,因为接受的答案适用于我过去使用的所有 Visual Studio 版本。 @MichaelCalvin 设置后你必须使用 Ctrl + F5 运行,这才是关键。 正如@JonathanMee 所说,您仍然运行 Ctrl + F5。这已经在我的 Visual Studio 2015 中设置好了,所以第一个答案是最有帮助的。 这确实是正确的。如果您将一个新的 C++ 文件添加到一个空项目中,那么熟悉的 CTRL+F5 将会失败。 在 Visual Studio Express 2015 上为我工作。谢谢。【参考方案6】:

在程序结束时使用Console.ReadLine()。这将使窗口保持打开状态,直到您按下 Enter 键。详情请见https://docs.microsoft.com/en-us/dotnet/api/system.console.readline。

【讨论】:

【参考方案7】:

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

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

来自Visual Studio documentation的对应片段:

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

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

【讨论】:

我刚刚在 VS2017 和 VS2019 中测试过这个。它需要将子系统设置为 CONSOLE 并关闭此选项。有一个或另一个或都不自动关闭窗口。 如果我从同一个解决方案启动多个项目,这仍然会为我关闭窗口。 我觉得这是 VS 2017 及以后的正确答案。太糟糕了,它不在旧版本中。 如何更改 Makefile 项目的子系统?【参考方案8】:

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

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

【讨论】:

【参考方案9】:

您也可以使用此选项

#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;

【讨论】:

【参考方案10】:

任意使用:

    cin.get();

    system("pause");

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

【讨论】:

【参考方案11】:

只要把你的最后一行代码:

system("pause");

【讨论】:

【参考方案12】:

一个更好的解决方案:

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

在程序的开头。

优点:

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

缺点:

必须修改代码 不会在 std::terminate() 上暂停 仍会在 IDE/调试器会话之外的程序中发生;您可以在 Windows 下使用以下方法防止这种情况:
extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) 
    if (IsDebuggerPresent())
        atexit([] system("PAUSE"); );
    ...

【讨论】:

非常糟糕的建议。 你能详细说明原因吗? 在不调试的情况下它没有任何用处,因为在这种情况下没有需要解决的问题。在VS里只要按Ctrl+F5运行程序就行了,所以VS里没问题,在命令解释器里也没问题,总之没问题。在调试过程中想要停止的情况下,添加代码停止不是比断点更方便的解决方案,并且会干扰不想停止的情况。【参考方案13】:

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

#include <iostream>;

int main()

    getchar();
    return 0;

【讨论】:

【参考方案14】:

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

#include <stdlib.h>

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

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

【讨论】:

此方法在 Visual C++ 中不起作用(除非包含一些标头?) @wmac 你必须包含 windows.h 标头 我没有包含任何库或命名空间,但它运行正常,非常感谢。 在 Visual Studio 2013 Express 上为我工作。 :) 不需要创建宏——只需调用system("pause")。如果您必须在其他系统上使用它,请用#ifdef 将其括起来。【参考方案15】:

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

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

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

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

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

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

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

如果我知道如何加载符号,我会发布更新。我按照this 尝试了/Z7,但没有成功。

【讨论】:

这仍然不支持调试,但至少它解决了无法看到输出的问题,例如的 VLD,与 所有 其他答案相比。【参考方案16】:

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

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

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

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

如果您想在多个地方执行此操作,请将上述代码放在一个方法中(例如private void Pause()),并在程序到达可能结束时调用Pause()

【讨论】:

当我执行 cntrl+f5 时它会打开然后立即关闭?你如何解决这个问题? 当我按下 Ctrl + F5 时,什么也没有发生。它曾经对我有用,但突然之间,它停止了工作。【参考方案17】:

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

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

我结束了

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

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

【讨论】:

【参考方案18】:

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

【讨论】:

对于简单的 Hello Name 控制台应用程序在 VS 2008 中不起作用。 cout、cin、cout、getchar()、控制台仍然关闭。有什么关系? 如果您在 getchar() 之前有一个 cout,请尝试将 getchar() 放入两次。 getchar() 需要一个字符,而你已经用 cout 给它了...如果这有帮助,请告诉我:)【参考方案19】:

转到调试菜单->按下 StartWithoutDebugging

【讨论】:

这在 VS 2008 中甚至不是一个选项,除非选择了 C# 开发环境。 CTRL + F5 虽然有效。您还可以通过“工具”>“自定义”将其作为按钮添加到工具栏。 如果您有多个项目,请将相关的一个设置为启动项目【参考方案20】:

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

【讨论】:

如果可行,这将是一个很好的解决方案。 pause 似乎只在批处理文件中工作,虽然它在 STDIN 上从您的程序接收输入,但它不会重新打印该文本。我尝试用&amp;&amp; 替换|,但没有效果——大概是因为它没有使用命令shell (cmd.exe) 执行。【参考方案21】:

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

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

return YOUR_MAIN_CODE;

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

【讨论】:

【参考方案22】:

如果您使用的是 .NET,请将Console.ReadLine() 放在程序结束之前。

它将等待&lt;ENTER&gt;

【讨论】:

+1 - 或者 Console.ReadKey() 等待任何键。 很奇怪,这对我的应用没有影响。它仍然会在不等待用户输入的情况下关闭。 那么你的代码很可能在到达那个点之前就退出了。 如果您正在运行测试,这不是一个很好的解决方案,因为它们会导致您的测试挂起并且永远不会退出。【参考方案23】:

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

【讨论】:

如果您有一个 C++ 应用程序并且在不调试的情况下运行并且控制台窗口仍然关闭,您需要记住在配置属性/链接器/系统下将子系统显式设置为控制台。如果您从一个空项目开始,这可能会发生这种情况,这会导致子系统未设置。 对我不起作用 :( 控制台窗口会立即打开和关闭,但日志会暂停并等待再次按 F5 正确答案是@TrevorRobinson 的答案:如果您无法找到配置属性的位置,这里是扩展版本:在 Visual Studio 中右键单击您的项目 > 属性 > 配置属性 >链接器>系统,将子系统更改为“控制台” 特雷弗·罗宾逊是对的。如果你开始一个空白项目,和 C++ 项。你需要去查看->属性管理器->属性(扳手图标)->配置。 Properties->Linker->System->Subsystem->在弹出的菜单中选择Console。 我在 VS 社区 2017 工作。ctrl+f5 不工作,当我右键单击项目时没有 Propertieswrench icon 也是灰色的。

以上是关于防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭的主要内容,如果未能解决你的问题,请参考以下文章

在Visual Studio中编码c ++时消失的控制台窗口

如何使用Visual Studio2010编译C语言

visual studio怎么使用c语言

如何使用visual studio 2017编写一个C++程序

Visual Studio如何创建 C语言的工程

如何使用Visual Studio2010运行C语言