我开始在Visual c++和我想知道如何保持控制台窗口。
例如,这将是一个典型的“hello world”应用程序:
int _tmain(int argc, _TCHAR* argv[]) { cout << "Hello World"; return 0; }
我漏了哪一行?
标准的方法是在return语句之前cin.get()。
cin.get()
int _tmain(int argc, _TCHAR* argv[]) { cout << "Hello World"; cin.get(); return 0; }
你可以在return语句之前使用cin.get();或cin.ignore();来避免控制台窗口关闭。
cin.get();
cin.ignore();
另一种选择是使用
#include <process.h> system("pause");
虽然这不是很可移植,因为它只能在Windows上工作,但它会自动打印
按任意键继续…
cin.get(),或system("PAUSE")。 我没有听说过你可以使用return(0);
system("PAUSE")
return(0);
使用Ctrl+F5启动项目,而不是仅使用F5。
在程序退出后,控制台窗口现在将保持打开状态,并显示Press any key to continue . . .消息。
Press any key to continue . . .
注意,这需要Console (/SUBSYSTEM:CONSOLE)链接器选项,您可以如下方式启用该选项:
Console (/SUBSYSTEM:CONSOLE)
CTRL-F5和子系统提示一起工作;它们不是独立的选项。
(由DJMorreTX from http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6提供)
在return行上设置断点。
return
你在调试器中运行它,对吧?
在main()的结束大括号上放置断点。即使有多个return语句,它也会被绊倒。唯一的缺点是对exit()的调用不会被捕获。
main()
exit()
如果你没有调试,按照Zoidberg回答中的建议,用Ctrl+F5来启动你的程序,而不仅仅是F5。
只需在_tmain方法的右括号中添加一个断点。这是一种更简单的方法,而且你不需要为了调试而添加代码。
_tmain
我包括#include <conio.h>,然后在return 0;行之前添加getch();。这是我在学校学到的。我看上面提到的方法有很大不同。
#include <conio.h>
return 0;
getch();
我也有同样的问题。我在return语句之前使用了_getch()。它的工作原理。
_getch()
对于makefile项目,被接受的解决方案失败了,原因是Visual Studio中的一个bug(这个bug至少在2012版之前都存在-我还没有测试2013版)。此错误详细描述为在这里。
为了在makefile项目的程序终止后让控制台暂停,执行以下步骤(这可能与2010 - 2012以外的版本有所不同):
1)将/SUBSYSTEM:CONSOLE传递给链接器。 - 编辑:见下文。
/SUBSYSTEM:CONSOLE
2)在文本编辑器中打开项目文件(.vcxproj)。
3)在根<project>标记中,插入以下内容:
<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>
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; }
下面是一种不修改任何代码而保持命令窗口打开的方法:
在Visual Studio中,打开项目属性页 -> 调试。
对于命令,输入$(ComSpec)
$(ComSpec)
对于命令参数,输入/k $(TargetPath)。将任何参数附加到您自己的应用程序。
/k $(TargetPath)
现在F5或Ctrl-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 ();//从用户