如何在Visual c++中保持控制台窗口打开?

我开始在Visual c++和我想知道如何保持控制台窗口。

例如,这将是一个典型的“hello world”应用程序:

int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}

我漏了哪一行?

304230 次浏览

标准的方法是在return语句之前cin.get()

int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
cin.get();
return 0;
}

你可以在return语句之前使用cin.get();cin.ignore();来避免控制台窗口关闭。

另一种选择是使用

#include <process.h>
system("pause");

虽然这不是很可移植,因为它只能在Windows上工作,但它会自动打印

按任意键继续…

cin.get(),或system("PAUSE")。 我没有听说过你可以使用return(0);

使用Ctrl+F5启动项目,而不是仅使用F5

在程序退出后,控制台窗口现在将保持打开状态,并显示Press any key to continue . . .消息。

注意,这需要Console (/SUBSYSTEM:CONSOLE)链接器选项,您可以如下方式启用该选项:

  1. 打开您的项目,并转到解决方案资源管理器。如果你跟上我的K&R,你的“解决方案”;将是'hello'与1项目下,也'hello'在粗体。
  2. 右键点击“hello"(或者你的项目名称)
  3. 选择“Properties"从上下文菜单。
  4. 选择Configuration Properties> link >System。
  5. 对于“子系统”;属性中,单击右侧列中的下拉框。
  6. 选择“控制台(/子系统:控制台)”;
  7. 单击Apply,等待它完成它所做的事情,然后单击OK。(如果“Apply"是灰色的,选择其他子系统选项,单击Apply,然后返回并应用控制台选项。我的经验是OK本身是行不通的。)

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

(由DJMorreTX from http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6提供)

return行上设置断点。

你在调试器中运行它,对吧?

main()的结束大括号上放置断点。即使有多个return语句,它也会被绊倒。唯一的缺点是对exit()的调用不会被捕获。

如果你没有调试,按照Zoidberg回答中的建议,用Ctrl+F5来启动你的程序,而不仅仅是F5

只需在_tmain方法的右括号中添加一个断点。这是一种更简单的方法,而且你不需要为了调试而添加代码。

我包括#include <conio.h>,然后在return 0;行之前添加getch();。这是我在学校学到的。我看上面提到的方法有很大不同。

我也有同样的问题。我在return语句之前使用了_getch()。它的工作原理。

对于makefile项目,被接受的解决方案失败了,原因是Visual Studio中的一个bug(这个bug至少在2012版之前都存在-我还没有测试2013版)。此错误详细描述为在这里

为了在makefile项目的程序终止后让控制台暂停,执行以下步骤(这可能与2010 - 2012以外的版本有所不同):

1)将/SUBSYSTEM:CONSOLE传递给链接器。 - 编辑:见下文。

2)在文本编辑器中打开项目文件(.vcxproj)。

3)在根<project>标记中,插入以下内容:

<ItemDefinitionGroup>
<Link>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>

4)重新加载解决方案中的项目。

5)不调试运行程序(CTRL + F5)。

编辑:

根据我下面的评论,设置连接器选项/SUBSYSTEM:CONSOLE实际上与makefile项目无关(如果你使用的是MSVC以外的编译器,甚至不一定是可能的)。重要的是将设置添加到.vcxproj文件中,就像上面的第3步一样。

只需要在main的最后一个花括号上加一个断点。

    int main () {
//...your code...
return 0;
} //<- breakpoint here

它适合我,不需要调试就可以运行。它还会在到达断点之前执行析构函数,这样您就可以检查在这些析构函数上打印的消息(如果有的话)。

(有些选项可能被称为不同的名称。我不使用英文版)

我有同样的问题,当我创建项目的选项“空项目”,创建项目为“win32控制台应用程序”而不是“空项目”。在现在弹出的对话框中,你按“继续”,之后你可以勾选“空项目”选项并按确认。然后按CTRL + F5将打开一个控制台,但不会自动关闭。

我也有同样的问题;在我的应用程序中有多个exit()点,没有办法知道它到底在哪里退出,然后我发现了这一点:

atexit(system("pause"));

atexit(cin.get());

这样,无论我们退出程序的哪个位置,它都会停止。

我的观点:

选择1:在main()的末尾添加断点

选择2:在return 0;之前添加以下代码:

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

你需要为std::numeric_limits包含<iomanip>

你可以把 keep_window_open (); 在返回之前,这里有一个例子

int main()
{
cout<<"hello world!\n";
keep_window_open ();
return 0;
}

另一个选择:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

主要:

int main(int argc, char* argv[]) {
MAINRET;
}

只需在代码的末尾添加system("pause"),然后像这样返回0

#include <stdlib.h>


int main()
{
//some code goes here
system("pause")
return 0;
}
实际上,真正的解决方案是项目模板本身的选择。 你必须在旧的VS中选择Win32控制台应用程序,或者先填写项目名称,然后双击Windows桌面向导,然后选择Win32控制台应用程序。然后在此时选择空项目。然后,这允许原始提问者真正想要的东西,而无需添加额外的停止点和保持代码。 我也遇到过这个问题。答案也是在MSDN站点。

下面是一种不修改任何代码而保持命令窗口打开的方法:

在Visual Studio中,打开项目属性页 -> 调试

对于命令,输入$(ComSpec)

对于命令参数,输入/k $(TargetPath)。将任何参数附加到您自己的应用程序。

现在F5Ctrl-F5在一个新窗口中执行Windows / System32系统/用于cmd . exe,并且/ k确保命令提示符在执行完成后保持打开。

缺点是执行不会在断点处停止。

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

正如一些人已经指出的那样,zoidberg的解决方案没有附加调试器,这是您通常不希望看到的。

在我看来,最好的选择是相应地配置你的VS(从VS 2017开始),通过到工具>选项>调试>通用。在这里,您取消选中“调试停止时自动关闭控制台”(在最底部),在您的情况下,可能选中了该选项。

就在your includes之后 YW std:: cin.clear ();//重置任何错误标志 std:: cin.ignore (std:: numeric_limitsstd:: streamsize:: max (), ' \ n ');//忽略输入缓冲区中的任何字符,直到找到一个输入字符 std:: cin.get ();//从用户

获取一个字符