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

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

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

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

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

【问题讨论】:

  • Monodevelop 符合您的预期。

标签: c visual-studio console


【解决方案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 中运行的应用执行此操作。但是有两种解决方法:

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

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

      【讨论】:

        【解决方案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)”。

            1. 转到“查看”,然后选择“物业经理”
            2. 右键单击项目/解决方案并选择“属性”。这将打开一个测试属性页面
            3. 导航到链接器,然后选择“系统”
            4. 点击“子系统”,出现下拉菜单
            5. 选择“控制台 (/SUBSYSTEM:CONSOLE)”
            6. 应用并保存
            7. 下次使用“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】:

                任意使用:

                1. cin.get();

                1. 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(经过测试)上,它不加载符号,因此调试非常受限。

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

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

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

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

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

                      现在,当您运行时,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 也是灰色的。
                          猜你喜欢
                          • 2019-01-18
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-04-20
                          • 2014-02-17
                          • 2011-08-28
                          • 2022-01-27
                          相关资源
                          最近更新 更多