如何阻止C ++控制台应用程序立即退出?

时间:2010-03-27 14:29:42

标签: c++ console exit terminate c++-faq

最近,我一直在尝试从this website学习C ++。不幸的是,每当我尝试运行其中一个代码示例时,我会看到该程序打开大约半秒然后立即关闭。有没有办法阻止程序立即关闭,以便我可以看到我努力的成果?

37 个答案:

答案 0 :(得分:135)

如果您正在使用Visual Studio,并且您正在从IDE启动控制台应用程序:

CTRL-F5 (启动而不调试)将启动应用程序并保持控制台窗口打开,直到您按任意键。

答案 1 :(得分:111)

编辑:正如Charles Bailey在下面的评论中正确指出的那样,如果在stdin中缓存了某些字符,这将无效,并且确实没有好办法解决这个问题。如果您使用附加的调试器运行,John Dibling's suggested solution可能是解决您问题的最简洁的解决方案。

那就是说,我会把它留在这里,也许别人会觉得它很有用。在开发过程中编写测试时,我已经习惯了很多种类。


main功能结束时,您可以拨打std::getchar();

这将从stdin获得单个字符,从而为您提供“按任意键以继续”某种行为(如果您确实需要“按任意键”消息,则必须打印一个自己)。

#include <cstdio>需要getchar

答案 2 :(得分:100)

James的解决方案适用于所有平台。

或者在Windows上,您也可以在从main函数返回之前添加以下内容:

  system("pause");

这将运行pause命令,等待你按一个键并显示一条好消息Press any key to continue . . .

答案 3 :(得分:76)

如果您正在使用Microsoft的Visual C ++ 2010 Express并遇到问题, CTRL + F5 无法在程序终止后保持控制台处于打开状态,请查看this MSDN thread

可能你的IDE设置为在CTRL + F5运行后关闭控制台;事实上,Visual C ++ 2010中的“空项目”默认关闭控制台。要更改此设置,请按Microsoft主持人的建议进行操作:

  

请右键单击您的项目名称并转到“属性”页面,请展开“配置属性” - &gt;链接器 - &gt;系统,请在SubSystem下拉列表中选择Console(/ SUBSYSTEM:CONSOLE)。因为,默认情况下,Empty项目不指定它。

答案 4 :(得分:18)

我通常只在main()的大括号上放一个断点。当通过断点将触及的任何方式到达程序的末尾时,您可以ALT-Tab到控制台窗口以查看输出。

答案 5 :(得分:14)

为什么不从控制台运行程序,即如果您使用的是Windows,则从cmd.exe运行程序。这样,程序结束后窗口就会保持打开状态。

[编辑]:当我使用KDevelop4时,在IDE底部的选项卡中运行了一个完全成熟的Bash(Linux CLI)实例。这就是我在这种情况下使用的内容。

答案 6 :(得分:9)

在代码结束之前,请插入以下行:

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
}

答案 7 :(得分:8)

拨打cin.get(); 2次:

    //...
    cin.get();
    cin.get();
    return 0
}

答案 8 :(得分:4)

如果您从一个称职的IDE(例如Code::Blocks)运行代码,IDE将管理它用于运行代码的控制台,并在应用程序关闭时保持打开状态。您不希望添加特殊代码来保持控制台处于打开状态,因为当您在IDE之外使用它时,这将阻止它正常运行。

答案 9 :(得分:3)

好吧我猜你是在Windows上使用Visual Studio ......为什么?好吧,因为如果你在某种Linux操作系统上,那么你可能会从控制台运行它。

无论如何,您可以像其他人建议的那样在程序结尾添加垃圾,或者您只需点击 CTRL + F5 (无需调试即可启动),Visual Studio将在完成后退出控制台

如果你想运行Debug版本而不是在代码中添加crap,另一个选择是打开控制台窗口(开始 - >运行 - > cmd)并导航到调试输出目录。然后,只需输入您的可执行文件的名称,它将在控制台中运行您的调试程序。然后,如果您真的想要,可以使用Visual Studio的附加进行处理。

答案 10 :(得分:2)

对于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 ++所称)。

答案 11 :(得分:2)

我这样做:

//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更好,但它有点罗嗦而且通常是不必要的。

答案 12 :(得分:2)

使用#include "stdafx.h"&amp; 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");
}

答案 13 :(得分:2)

#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

    cout << "Press any key to continue...";
    getch();

    return 0;
}

我没有注意到其他人发布这个,所以在这里。

答案 14 :(得分:2)

只需在程序结束时添加以下内容即可。它将尝试捕获某种形式的用户输入,从而阻止控制台自动关闭。

cin.get();

答案 15 :(得分:2)

在任何exit()功能之前或return中的任何main()之前添加以下行:

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");

答案 16 :(得分:2)

如果您实际在Visual C ++中调试应用程序,请按F5或工具栏上的绿色三角形。如果你没有真正调试它(你没有设置断点),按Ctrl + F5或在菜单上选择Start Without Debugging(它通常在Debug菜单上,我同意这是令人困惑的。)它会快一点,更重要的是,你最终会停下来而不必改变你的代码。

或者,打开命令提示符,导航到exe所在的文件夹,然后键入其名称来运行它。这样,当它完成运行命令提示符时,不会关闭,您可以看到输出。我更喜欢这两种方法来添加代码来停止应用程序就像完成它一样。

答案 17 :(得分:1)

类似的想法 yeh 回答,只是极简主义的选择。

使用以下内容创建批处理文件:

helloworld.exe
pause

然后使用批处理文件。

答案 18 :(得分:0)

这里有一个问题,不是那么明显。不知何故,我在程序的最后一行添加了一个调试断点。 } 不知道我是怎么做到的,可能是在不同屏幕之间跳转时错误地点击了鼠标。我在 VS Code 中工作。

当我去调试时,系统立即跳转到那个断点。没有错误消息,没有临时输出,什么都没有。我想,程序是如何冲过我设置的所有断点的?这花了太长时间才弄明白。

显然系统将最后一行断点视为“第一个”停止点。简单的修复?删除那个断点,哦! (在这里插入额头巴掌。)

答案 19 :(得分:0)

只需在返回0之前使用cin.ignore();两次

main()
  {
  //your codes 

  cin.ignore();
  cin.ignore();

  return 0;
  }

那就是

答案 20 :(得分:0)

你也可以尝试这样做

sleep (50000);
cout << "any text" << endl;

这将保存您的代码 50000m,然后打印消息并关闭。但请记住,它不会永远暂停。

答案 21 :(得分:0)

不是按下运行按钮,同时按下CTRL和F5,它会按下任意键继续消息。或者输入&#34;(警告使用此功能仅用于测试不是实际程序,因为防病毒不喜欢!!!!)&#34;在你的主要功能的最后,但是:(警告使用它只测试不是真正的程序,因为antiviruses不喜欢它!)

答案 22 :(得分:0)

我尝试在最后放置一个getchar()函数。但它没有用。所以我所做的是一个接一个地添加两个getchar()函数。我认为第一个getchar()吸收了在最后一次数据输入后按下的 Enter 键。因此,请尝试添加两个getchar()函数,而不是一个

答案 23 :(得分:0)

我使用了cin.get(),但是有一天我需要在此之前使用另一个cin.get([Array Variable])来获取一个空白字符的字符串。所以cin.get()没有避免关闭命令提示窗口。最后我找到了另一种方式: 按 CTRL + F5 在外部窗口中打开,Visual Studio无法再对其进行控制。在最终命令运行后,你会问你关闭。

答案 24 :(得分:0)

简单地

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

答案 25 :(得分:0)

我在程序的最后一次返回0处设置断点。它工作正常。

答案 26 :(得分:0)

如果您运行的是Windows,则可以执行system("pause >nul");system("pause");。它执行一个控制台命令来暂停程序,直到你按下一个键。 >nul阻止其说Press any key to continue...

答案 27 :(得分:0)

您可以随时创建一个批处理文件。例如,如果您的程序名为helloworld.exe,则代码为:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1

答案 28 :(得分:0)

这似乎运作良好:

cin.clear();
cin.ignore(2);

如果先清除缓冲区,则在阅读下一个缓冲区时不会出现问题。 出于某种原因,cin.ignore(1)不起作用,必须为2。

答案 29 :(得分:0)

查看您的IDE是否在项目设置中有一个复选框,以便在程序终止后保持窗口打开。如果没有,请使用std::cin.get();读取主函数末尾的字符。但是,一定要只使用基于行的输入(std :: getline)或者处理剩余的未读字符(std :: ignore直到换行),否则末尾的.get()只会读取你留下的垃圾早先未读。

答案 30 :(得分:-1)

您只需为x设置一个变量,然后在返回0;

之前输入
cout<<"\nPress any key and hit enter to end...";
cin>>x;

答案 31 :(得分:-1)

您甚至可以在main()函数的开头声明一个整数(比如int a;),并在返回值之前放置std::cin >> a;。因此程序将继续运行,直到您按下一个键并输入。

答案 32 :(得分:-2)

包含conio.h,在代码末尾,return 0之前,写下_getch();

答案 33 :(得分:-3)

以调试模式启动,使用F5运行代码 要停止您的控制台应用程序,请不要单击红叉,而是按CTRL-break 并且你将在程序结束时点击所有断点。

答案 34 :(得分:-3)

你也可以坚持

while(true)
    ;

for(;;)
    ;

最后。

答案 35 :(得分:-4)

只需将其放在代码的末尾:

while(1){}

此功能将一直持续(或直到您关闭控制台),并使控制台不会自行关闭。

答案 36 :(得分:-4)

最熟练的方法是离开

while (true) {
}

在程序执行的最后一个函数的末尾。

(如果某人不知道这意味着什么,它基本上是一个永无止境的循环。由于括号内没有任何内容,它将永远不会做任何事情,它实际上没有任何作用,但对于该计划来说,这是另一项任务。