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


193

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


5
您是否双击可执行文件?您在Windows中工作吗?您为什么不从Command Shell工作,并在想要执行命令时键入命令?
S.Lott

8
@S Lott:因为如果您在IDE中按“转到”按钮,则无需打扰控制台。
Billy ONeal 2010年

4
您应该考虑获得一本好书,从中可以学习C ++。网站是很好的资源,但是没有很好的介绍性文字。还有的C ++书籍的定义列表在这里: stackoverflow.com/questions/388242/...
詹姆斯McNellis

6
@Billy如果在终止时按“ Go”按钮将其关闭,则说明您使用的是错误的IDE。

2
之前在此处提问和回答:stackoverflow.com/questions/902261/…,尽管这个标题更好。
dmckee ---前主持人小猫

Answers:


120

编辑: 正如查尔斯·贝利(Charles Bailey)在下面的评论中正确指出的那样,如果在中缓冲了字符,则此方法将无效stdin,并且实际上没有解决此问题的好方法。如果您运行的是带有调试器的设备,则John Dibling建议的解决方案可能是解决问题的最干净的解决方案。

就是说,我将其留在这里,也许其他人会发现它有用。在开发过程中编写测试时,我经常使用它作为各种技巧。


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

这将从中获得一个字符stdin,从而为您提供“按任意键继续”的行为(如果您实际上想要“按任意键”消息,则必须自己打印一个)。

你需要#include <cstdio>getchar


15
getchar不能解决问题-或至少在有限的情况下。它从中读取一个char stdin,但是如果已经从stdin中缓冲了字符,则无论您是否打印提示,该程序都将继续运行而无需等待。
CB Bailey 2010年

1
@查尔斯:一个好点。忽略直到\n是部分解决方案,但是如果缓冲了多行输入,将无济于事。我不知道从输入流中清除所有内容的标准C ++方法。:-/
James McNellis

1
@詹姆斯:老了,但是std::cin.ignore(std::cin.rdbuf()->in_avail());呢?从这里得到它。
GManNickG

1
我用了很多的一种选择是std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');使用#include <limits>
Xeo

5
请不要这样做。:(这不是你的程序的功能的一部分,要做到这一点。
亮度种族在轨道

138

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

CTRL-F5(无需调试即可启动)将启动应用程序,并使控制台窗口保持打开状态,直到您按任意键。


1
从IDE中启动控制台?您将如何以及为什么这么做?
CodyBugstein

1
很好,很有效。为什么这不是Visual Studio的默认行为?
Luminaire

我也认为这是这样做的方法,直到今天,当我构建一个简单的控制台程序并且上面的方法不起作用时:(
KansaiRobot

1
是否有一个版本的这个调试?
luckyging3r

109

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

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

  system("pause");

这将运行pause命令,直到您按下一个键并显示一条好消息Press any key to continue . . .


2
这听起来像是解决方案的Rube Goldberg变体。
Dave Van den Eynde

4
@Dave Van den Eynde:这也很常见,并且是DevCPP中样板代码的标准配置。+1
Billy ONeal 2010年

4
另一方面,@ Dave确实清楚地表明这只是一个示例,而std:getch可能会意外地留在实际代码中。
马丁·贝克特

2
对于Windows上的用户而言,这是一个完全有效的解决方案。虽然不理想,但确实可以正常工作
thecoshman

最简单,最快的解决方案。我所需要的
CodyBugstein 2013年

83

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

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

请右键单击您的项目名称,然后转到“属性”页面,请展开“配置属性”->“链接器”->“系统”,然后在“子系统”下拉列表中选择“控制台(/ SUBSYSTEM:CONSOLE)”。因为默认情况下,Empty项目没有指定它。


1
如果它不是控制台应用程序怎么办?
杰西·派珀

3
@ Mr.Underhill这在没有调试器(Ctrl + F5)的情况下启动起作用。
乔纳森·梅2014年

除了作为唯一的非黑客解决方案之外,这也是从主堆栈对象析构函数查看打印内容的唯一方法。
Poniros

20

我通常只是在main()的右花括号上设置一个断点。当通过任何方式到达程序末尾时,将命中断点,您可以将ALT-Tab转到控制台窗口以查看输出。


14

为什么不直接从控制台运行程序,即如果使用Windows,则从cmd.exe运行程序。这样,程序完成后窗口将保持打开状态。

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


3
因为如果您使用的是IDE,则通常不使用控制台。您推走,程序开始运行,仅此而已。
Billy ONeal 2010年

3
当应用程序终止时,任何称职的IDE都会在屏幕上显示控制台-例如,Code :: Blocks就是这样做的。

3
@nobugz:我想通了。要使窗口停留在周围,必须在链接器命令行上具有/ SUBSYSTEM:CONSOLE。文档说这是默认的if main,但是如果我没有在命令行上显式设置它,则在应用程序退出时VS会杀死该窗口。 感叹
James McNellis

2
@James:首先需要一个控制台窗口。反过来,它需要main()而不是WinMain(),而不是相反。我有点迷路了……
汉斯·帕桑

4
@nobugz:如果从“空项目”而不是“ Win32控制台应用程序”开始,则不会在项目属性中显式设置子系统。如果main在项目中定义,则链接器默认情况下使用CONSOLE子系统。在调试或运行时,您将获得一个控制台窗口。但是,除非您在项目属性中明确指定CONSOLE作为子系统,否则Visual Studio将不会保持控制台窗口打开。我总是从一个空项目开始,很少更改单个项目的属性,所以我从未见过控制台窗口会停留在周围。抱歉给您带来困惑
James McNellis

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
}

它还打印了“按任意键继续...”。为了我。
PapaHotelPapa

8

通话cin.get();2次:

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

6
但是为什么要两次??
Madhawa Priyashantha

如果我们需要另一个cin.get()来获取例如此之前的数组内的字符串怎么办?在这种情况下不起作用。
QMaster 2015年

4

如果从功能强大的IDE(例如Code :: Blocks)运行代码,则IDE将管理用于运行代码的控制台,并在应用程序关闭时保持打开状态。您不想添加特殊代码来保持控制台打开,因为当您在IDE之外将其用于实际环境时,这将阻止其正常运行。


3

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

无论如何,您可以像其他人建议的那样将废话添加到程序的末尾,或者只需按CTRL + F5(无需调试即可启动),一旦完成,Visual Studio就会退出控制台。

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


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

using namespace std;

int main()
{

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

    return 0;
}

我没有注意到其他人张贴了这篇文章,所以在这里。


我要补充一点,它conio.h是Windows特定的头文件,可能并非在每台机器上都可用(或者您可能需要单独链接它,这太过分了)。
Yksisarvinen

加工。只需更改getch(); 到_getch(); 自从它变得废弃之后
ncesar

2

如果您实际上是在Visual C ++中调试应用程序,请按F5或工具栏上的绿色三角形。如果您没有真正调试它(没有设置断点),请按Ctrl + F5或在菜单上选择“开始而不进行调试”(通常在“调试”菜单上,我同意这很令人困惑。)它会更快一点,对您而言更重要的一点是,它将在最后暂停,而无需您更改代码。

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


2

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

cin.get();

2

在以下任何exit()函数之前或中的任何returns 之前添加以下行main()

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

这对我不起作用,第一行有效,但按Enter键无济于事
Qwertie 2014年

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 ++调用它们)。


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


它有效,但是返回0;如果使用此代码,则不会执行。
wernersbacher's

2

使用#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");
}

system被声明为<cstdlib>,而不是stdafx.h
melpomene'1

1

类似的想法回答,只是简约的替代品。

创建具有以下内容的批处理文件:

helloworld.exe
pause

然后使用批处理文件。


1

只是

#include <cstdio>

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

由于某些原因,运行程序时,通常在stdin中已经可以使用getchar读取1个字符。因此,第一个getchar读取此字符,第二个getchar在退出程序之前等待用户(您的)输入。并且在程序退出大多数终端后,尤其是在Windows上,请立即关闭终端。因此,我们的目标是防止程序在输出所有内容后完成的简单方法。当然,有更复杂,更干净的方法可以解决此问题,但这是最简单的。


2
请至少添加一个简短的解释,说明为什么这可以解决问题。
kaya3

0

查看您的IDE在项目设置中是否具有复选框,以在程序终止后保持窗口打开。如果不是,请使用std::cin.get();main函数末尾的字符进行读取。但是,请确保仅使用基于行的输入(std :: getline)或处理剩余的未读字符(否则std :: ignore直到换行),因为否则末尾的.get()将仅读取您留下的垃圾之前未读。


0

这似乎运作良好:

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

如果先清除缓冲区,则在读取下一个缓冲区时不会有问题。由于某些原因cin.ignore(1)无法正常工作,因此必须为2。


1
2有时还是不够的(当排队的击键更多时)。正确的方法是忽略队列中尽可能多的字符。与一起使用cin.rdbuf()->in_avail。不是一些神奇的数字,如1或2
康拉德·鲁道夫

0

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

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

0

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


0

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


1
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论-您随时可以对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论
拉维·德霍里亚

1
这怎么不提供答案?我处于与问题作者完全相同的情况,这会有所帮助。
lierosk 2014年

0

我曾经使用cin.get()过,但是很有效,但是有一天我需要使用另一天cin.get([Array Variable])之前,要抓住中间带有空白字符的ling字符串。因此cin.get()无法避免命令提示符窗口关闭。最后,我发现了另一种方法:按CTRL + F5在外部窗口中打开,Visual Studio不再对其进行控制。只是会询问您有关最终命令运行后关闭的信息。


0

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


0

无需同时按运行按钮,而是同时按CTRL和F5,它将使您可以按任意键继续发送消息。或在主要功能的末尾键入“(警告仅将其用于测试实际程序,因为防病毒软件不喜欢它!!!)”,但:(警告仅将其用于测试实际程序,因为防病毒软件不会不喜欢!!!!)


0

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

main()
  {
  //your codes 

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

  return 0;
  }

就这样


我通常这样做。cin.ignore(); cin.get();
aj.toulan

-1

您只需为x设置一个变量,然后在返回0之前键入该变量即可;

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

-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.