最近,我一直在尝试从这个网站学习 C++ 。不幸的是,每当我尝试运行其中一个代码示例时,我都会看到该程序打开了大约半秒,然后立即关闭。有没有办法阻止程序立即关闭,以便我可以看到我努力的成果?
35 回答
如果您使用的是 Visual Studio 并且要在 IDE 之外启动控制台应用程序:
按CTRL-F5(不调试就启动)将启动应用程序并保持控制台窗口打开,直到您按任意键。
编辑: 正如查尔斯·贝利(Charles Bailey)在下面的评论中正确指出的那样,如果有缓冲的字符,这将不起作用stdin
,并且确实没有解决此问题的好方法。如果您使用附加的调试器运行,John Dibling 建议的解决方案可能是解决您问题的最干净的解决方案。
也就是说,我将把它留在这里,也许其他人会发现它很有用。在开发过程中编写测试时,我经常使用它作为一种快速破解方法。
在main
函数结束时,您可以调用std::getchar();
这将从 中获得一个字符stdin
,从而为您提供“按任意键继续”的行为(如果您真的想要“按任意键”消息,您必须自己打印一个)。
你需要#include <cstdio>
为getchar
.
James 的解决方案适用于所有平台。
或者,您还可以在从函数Windows
返回之前添加以下内容:main
system("pause");
这将运行pause
等待您按下一个键并显示一条好消息的命令Press any key to continue . . .
如果您使用 Microsoft 的 Visual C++ 2010 Express 并遇到CTRL+F5在程序终止后无法保持控制台打开的问题,请查看此 MSDN 线程。
您的 IDE 可能设置为在 CTRL+F5 运行后关闭控制台;事实上,Visual C++ 2010 中的“空项目”默认关闭控制台。要更改此设置,请按照 Microsoft 版主的建议进行操作:
请右键单击您的项目名称并转到属性页面,请展开配置属性 -> 链接器 -> 系统,请在子系统下拉列表中选择控制台 (/SUBSYSTEM:CONSOLE)。因为,默认情况下,Empty 项目没有指定它。
main()
我通常只是在' 的右花括号上放一个断点。当以任何方式到达程序末尾时,断点将命中,您可以通过 ALT-Tab 键到控制台窗口查看输出。
如果您使用的是 Windows,为什么不直接从控制台运行程序,即从 cmd.exe 运行程序。这样程序完成后窗口保持打开状态。
[编辑]:当我使用 KDevelop4 时,在 IDE 底部的选项卡中运行着一个成熟的 Bash 实例(一个 Linux CLI)。这就是我在这种情况下使用的。
在代码结束之前,插入以下行:
system("pause");
这将保留控制台,直到您按下一个键。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cout << "Please enter your first name followed by a newline\n";
cin >> s;
cout << "Hello, " << s << '\n';
system("pause"); // <----------------------------------
return 0; // This return statement isn't necessary
}
调用cin.get();
2 次:
//...
cin.get();
cin.get();
return 0
}
如果您从称职的 IDE(例如Code::Blocks)运行代码,IDE 将管理用于运行代码的控制台,并在应用程序关闭时保持打开状态。您不想添加特殊代码来保持控制台打开,因为当您在 IDE 之外实际使用它时,这将阻止它正常运行。
我只是这样做:
//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;
注意:清除 cin 缓冲区等只有在您在程序中的某个时间点使用过 cin 时才需要。同样使用 std::numeric_limits::max() 可能比 INT_MAX 更好,但它有点罗嗦而且通常是不必要的。
好吧,我猜你是在 Windows 上使用 Visual Studio ......为什么?好吧,因为如果您使用的是某种 Linux 操作系统,那么您可能会从控制台运行它。
无论如何,您可以像其他人建议的那样在程序末尾添加废话,或者您可以直接按CTRL + F5(无需调试即可开始),Visual Studio 将在完成后离开控制台。
如果您想运行 Debug 版本而不是在代码中添加废话,另一个选择是打开控制台窗口(开始 -> 运行 -> cmd)并导航到您的Debug 输出目录。然后,只需输入可执行文件的名称,它将在控制台中运行您的调试程序。然后,如果您真的愿意,可以使用 Visual Studio 的附加来处理或其他东西。
只需在程序末尾添加以下内容。它将尝试捕获某种形式的用户输入,从而阻止控制台自动关闭。
cin.get();
如果您实际上是在 Visual C++ 中调试应用程序,请按 F5 或工具栏上的绿色三角形。如果你没有真正调试它(你没有设置断点),请按 Ctrl+F5 或在菜单上选择 Start without Debugging(它通常在 Debug 菜单上,我同意这会令人困惑。)它会快一点,对你来说更重要的是,最后会暂停,而无需更改代码。
或者,打开命令提示符,导航到您的 exe 所在的文件夹,然后通过键入其名称来运行它。这样,当它完成运行时,命令提示符不会关闭,您可以看到输出。我更喜欢这两种方法,而不是添加在应用程序完成时停止应用程序的代码。
exit()
在任何函数之前或任何return
s in之前添加以下行main()
:
std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
简单地
#include <cstdio>
int main(){
// code...
std::getchar();
std::getchar();
return 0;
}
由于某种原因,当您运行程序时,通常可以在标准输入中使用 getchar 读取 1 个字符。所以第一个 getchar 读取这个字符,第二个 getchar 在退出程序之前等待用户(您的)输入。并且在程序退出大多数终端后,尤其是在 Windows 上立即关闭终端。所以我们的目标是一种简单的方法来防止程序在输出所有内容后完成。当然有更复杂和更干净的方法来解决这个问题,但这是最简单的。
对于 Visual Studio(并且仅适用于 Visual Studio),以下代码片段为您提供“等待按键继续”提示,通过首先刷新输入缓冲区,真正等待用户显式按下新键:
#include <cstdio>
#include <tchar.h>
#include <conio.h>
_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();
请注意,这使用tchar.h
宏来兼容多个“字符集”(正如 VC++ 所称的那样)。
使用#include "stdafx.h"
&system("pause");
就像下面的代码一样。
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
std::cout << "hello programmer!\n\nEnter 2 numbers: ";
int x, y;
std::cin >> x >> y;
int w = x*y;
std::cout <<"\nyour answer is: "<< w << endl;
system("pause");
}
与你的答案类似的想法,只是极简主义的选择。
创建一个包含以下内容的批处理文件:
helloworld.exe
pause
然后使用批处理文件。
查看您的 IDE 是否在项目设置中有一个复选框,以在程序终止后保持窗口打开。如果没有,std::cin.get();
在 main 函数结束时使用读取一个字符。但是,请务必仅使用基于行的输入(std::getline)或处理剩余的未读字符(std::ignore until newline),否则最后的 .get() 只会读取您留下的垃圾之前未读。
这似乎运作良好:
cin.clear();
cin.ignore(2);
如果您先清除缓冲区,则在阅读下一个缓冲区时不会有问题。由于某种原因cin.ignore(1)
不起作用,它必须是2。
你总是可以只创建一个批处理文件。例如,如果您的程序名为 helloworld.exe,则某些代码将是:
@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
如果您正在运行 Windows,那么您可以执行system("pause >nul");
或system("pause");
。它执行控制台命令以暂停程序,直到您按下一个键。>nul
阻止它说Press any key to continue...
。
我在程序的最后一个 return 0 处设置了一个断点。它工作正常。
我用过cin.get()
,但有天我需要cin.get([Array Variable])
在此之前使用另一个来抓取一个中间有空白字符的 ling 字符串。所以cin.get()
没有避免关闭命令提示符窗口。最后我找到了另一种方法:按CTRL+F5在外部窗口中打开,Visual Studio 不再控制它。只是会在最终命令运行后询问您是否关闭。
我试着把一个getchar()
函数放在最后。但它没有用。所以我所做的就是getchar()
一个接一个地添加两个函数。我认为第一个getchar()
吸收了Enter您在最后一次数据输入后按下的键。所以尝试添加两个getchar()
函数而不是一个
而不是按运行按钮,同时按 CTRL 和 F5,它会给你按任意键继续消息。或者在您的主要功能的末尾键入“(警告仅用于测试非实际程序,因为防病毒软件不喜欢它!!!!)”但是:(警告仅用于测试非实际程序,因为防病毒软件不喜欢它)不喜欢!!!!)
只需在 return 0 之前使用 cin.ignore() ;两次
main()
{
//your codes
cin.ignore();
cin.ignore();
return 0;
}
就这样
你也可以尝试这样做
sleep (50000);
cout << "any text" << endl;
这将保留您的代码 50000m,然后打印消息并关闭。但请记住,它不会永远暂停。
这是一个问题,不是很明显。不知何故,我在程序的最后一行添加了一个调试断点。}
不知道我是怎么做到的,可能是在不同屏幕之间跳转时鼠标点击错误。我在 VS 代码中工作。
当我去调试时,系统会立即跳转到那个断点。没有错误消息,没有临时输出,什么都没有。我想,程序是如何冲过我设置的所有断点的?这花了太长时间才弄清楚。
显然,系统将最后一行断点视为“第一个”停止点。简单的修复?删除那个断点,doh!(在这里插入前额耳光。)
您甚至可以在main()
函数的开头声明一个整数(比如int a;
),然后将其放在std::cin >> a;
返回值之前。所以程序会一直运行,直到你按下一个键并输入。
您所要做的就是为 x 设置一个变量,然后在 return 0 之前输入它;
cout<<"\nPress any key and hit enter to end...";
cin>>x;
包括conio.h
和 在代码的末尾, before return 0
,写_getch();
你也可以坚持
while(true)
;
或者
for(;;)
;
在末尾。
以调试模式启动,使用 F5 运行代码以停止控制台应用程序,不要单击红叉,而是按 CTRL-break,您将在程序结束时遇到所有断点。
只需将其放在代码的末尾:
而(1){}
这个功能会一直持续下去(或者直到你关闭控制台),并且会阻止控制台自行关闭。