【问题标题】:C++ - Hold the console window open?C++ - 保持控制台窗口打开?
【发布时间】:2010-12-26 21:10:19
【问题描述】:

我的问题非常简单,但我正在从 C# 过渡到 C++,我想知道在 C++ 中打开控制台窗口的命令是什么?

我知道在C#中,最基本的方式是:

Console.ReadLine();

或者如果你想让用户按任意键,它:

Console.ReadKey(true);

你如何在 C++ 中做到这一点?我在这里问这个简单的问题的唯一原因是我无法在互联网上找到一个好的和明确的答案。

【问题讨论】:

  • 我记得在大学期间在 turbo-c 中使用来自 conio.hgetch();:但我想如果我在这里发布它作为答案,我会被否决:)跨度>
  • 使用std::cin.ignore(),看看下面我的回答。
  • 你可以使用 system("PAUSE");如果您不在生产环境中并且为 Microsoft 或 Borland 工作。但是我没有在Borland尝试过。请参阅下面 Mike Weller 的错误答案。

标签: c++ windows console


【解决方案1】:

std::cin.get(); 怎么样?

此外,如果您使用的是 Visual Studio,则无需调试即可运行(默认为 CTRL-F5),并且最终不会关闭控制台。如果你在调试的情况下运行它,你总是可以在main()的右大括号处放置一个断点。

【讨论】:

  • 是 std::cin.get() 只是命名空间 std 的成员吗?如果我包含 ,我可以直接使用:cin.get() 吗?
  • 如果你的源文件中有using namespace std;,那么是的。
  • 或者using std::cin;
  • 所以,我什至不需要这样的命令,因为如果不调试,控制台会自动保持打开状态?这很好。
  • std::cin.get() 仅适用于Enter,而Console.ReadLine() 适用于任何角色。
【解决方案2】:

正确的方式

cin.get();

cin.get() 与 C++ 兼容且可移植。它将从标准输入(stdin)中检索下一个字符。用户可以按回车键,然后您的程序将继续执行,或者在我们的例子中终止。

微软的看法

Microsoft 有一篇名为 Preventing the Console Window from Disappearing 的知识库文章。它描述了如何仅在必要时暂停执行,即仅当用户通过从资源管理器执行程序产生新的控制台窗口时。代码在 C 中,我在这里复制:

#include <windows.h>
#include <stdio.h>
#include <conio.h>

CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hStdOutput;
BOOL bUsePause;

void main(void)
{
        hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        if (!GetConsoleScreenBufferInfo(hStdOutput, &csbi))
        {
                printf("GetConsoleScreenBufferInfo failed: %d\n", GetLastError());
                return;
        }

        // if cursor position is (0,0) then use pause
        bUsePause = ((!csbi.dwCursorPosition.X) &&
                     (!csbi.dwCursorPosition.Y));

        printf("Interesting information to read.\n");
        printf("More interesting information to read.\n");

        // only pause if running in separate console window.
        if (bUsePause)
        {
                int ch;
                printf("\n\tPress any key to exit...\n");
                ch = getch();
        }
}

我自己用过这个,这是一个很好的方法,当然只在 Windows 下。另请注意,您可以在 Windows 下通过使用以下命令启动程序以非编程方式实现此目的:

cmd /K consoleapp.exe

错误的方式

请勿使用以下任何方法来实现此目的:

system("PAUSE");

这将通过在您的程序中生成一个新的 cmd.exe/command.com 进程来执行 windows 命令“暂停”。这既完全没有必要,也不可移植,因为 pause 命令是特定于 Windows 的。不幸的是,我经常看到这种情况。

getch();

这不是 C/C++ 标准库的一部分。它只是一个编译器扩展,一些编译器不支持它。

【讨论】:

  • 使用 system("pause") 只在 Visual Studio 或一些类似的 IDE 中学习,因为它很容易记住。但是您对此的说明很棒。我在这些教程tenouk.com 中看到了它,有时有,有时没有,但没有空白输入来保持控制台打开。
【解决方案3】:

如果您的问题是在 Visual Studio 中保留控制台窗口而不 修改您的应用程序(c 代码) 并使用 Ctrl+F5 运行它(运行 Ctrl+F5 时),但窗口仍在关闭 主要提示是在 Visual Studio 项目中设置 /SUBSYSTEM:CONSOLE 链接器选项。

正如 DJMooreTX 在 http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6

1) 打开您的项目,然后转到解决方案资源管理器。如果你和我一起在 K&R,你的“解决方案”将是“你好”,它下面有 1 个项目,还有粗体的“你好”。

  1. 右键单击“你好”(或任何您的项目名称。)

  2. 从上下文菜单中选择“属性”。

  3. 选择配置属性>链接器>系统。

  4. 对于右侧窗格中的“子系统”属性,单击右侧列中的下拉框。

  5. 选择“控制台 (/SUBSYSTEM:CONSOLE)”

  6. 单击“应用”,等待它完成所有操作,然后单击“确定”。 (如果“应用”是灰色的,选择其他子系统选项,点击应用,然后返回并应用控制台选项。我的经验是确定本身不起作用。)

现在执行 Boris 的 CTRL-F5,等待你的程序编译和链接,在你桌面上所有其他垃圾下面找到控制台窗口,并阅读你程序的输出,然后是心爱的“按任意键继续。 ...”提示。

同样,CTRL-F5 和子系统提示一起工作;它们不是单独的选项。

【讨论】:

  • 这正是我想要的。在 VS2008 中它曾经保持打开状态,但是当我切换到 VS2010 时,它在运行 ctrl+F5 后开始关闭。谢谢!
  • 优秀的答案!我很想知道为什么即使在没有调试器的情况下启动控制台也会关闭。
【解决方案4】:

更合适的方法是使用std::cin.ignore

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}

【讨论】:

  • 感谢
【解决方案5】:

您也可以稍微依赖一下 IDE。如果您使用“不调试就开始”命令(对我来说是 Ctrl+F5)运行程序,即使程序以“按任意键继续...”结束,控制台窗口仍将保持打开状态。信息。

当然,如果想使用“Hit any key”来保持程序运行(即保持线程处于活动状态),这是行不通的。当您运行“带调试”时它不起作用。但是你可以使用断点来保持窗口打开。

【讨论】:

  • Ctrl+F5 实际上是一个很好的解决我的难题的有效方法。谢谢!
【解决方案6】:

在windows中,你可以在

中使用_getch()
<conio.h>

标题。

【讨论】:

  • 这将适用于多个 Windows 编译器,但请注意:它不是标准的一部分,也不可​​移植。
【解决方案7】:

我在使用 mingw32 - gcc-4.6.2 编译器的环境中使用std::getwchar(),这是一个示例代码。

#include <iostream>
#include "Arithmetics.h"

using namespace std;

int main() {
    ARITHMETICS_H::testPriorities();

    cout << "Press any key to exit." << endl;
    getwchar();
    return 0;
}

【讨论】:

    【解决方案8】:

    正如 Thomas 所说,cin 忽略是一个好方法。 要始终等待用户按下回车(即使使用了退出),请注册一个函数 atexit:

    #include <iostream>
    
    void pause()
    {   ::std::cout<<"\nPress ENTER to exit.";
        ::std::cin.sync();
        if(::std::cin.get()!='\n')
            ::std::cin.ignore(0xFFFFFFFF,'\n');
    }
    
    int main()
    {
        atexit(pause);
    
        // whatever
    
        return 0;
    }
    

    【讨论】:

      【解决方案9】:

      如果您创建控制台应用程序,控制台将保持打开状态,直到您关闭该应用程序。

      如果您已经创建了一个应用程序并且您不知道如何打开控制台,您可以在项目配置 -> 链接器 -> 系统中将子系统更改为 Console(/Subsystem:Console)。

      【讨论】:

        【解决方案10】:

        与您在 C# 中所做的事情大致相同。调用getch() 可能是最简单的。

        【讨论】:

          【解决方案11】:

          首先要包含你应该使用的 c++ 函数

          include&lt;iostream.h&gt; 而不是 stdio .h

          and to hold the output screen there is a simple command getch();
          here, is an example:
          
             #include<iostream.h>
             #include<conio.h>
             void main()  \\or int main(); if you want
            {
              cout<<"c# is more advanced than c++";
              getch();
            }
          

          谢谢

          【讨论】:

          • 在严格遵循标准的系统上,这会产生几个错误: 它是 iostream,而不是 iostream.h,随着这个变化,还引入了需要使用的 std 命名空间; conio.h 不是标准的一部分,因此 getch() 也不是;最后但并非最不重要的是,这是我的编译器告诉我的:错误:'::main' must return'int'
          猜你喜欢
          • 2014-04-20
          • 2013-06-01
          • 2011-07-01
          • 2010-10-02
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多