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

How to stop C++ console application from exiting immediately?

提问人:Adam P 提问时间:3/27/2010 最后编辑:Peter MortensenAdam P 更新时间:10/16/2023 访问量:596688

问:

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

C 控制台 退出 终止 C++-FAQ

评论

5赞 S.Lott 3/27/2010
是否双击可执行文件?您在 Windows 中工作吗?为什么不从命令行界面工作,而是按照要求执行命令的方式键入命令?
9赞 Billy ONeal 3/27/2010
@S Lott:因为如果你在IDE中按下“Go”按钮,你就不需要为控制台而烦恼了。
4赞 James McNellis 3/27/2010
你应该考虑买一本学习C++的好书。网站是很好的资源,但不能与好的介绍性文本相提并论。这里有一份C++书的明确清单:stackoverflow.com/questions/388242/......
7赞 3/27/2010
@Billy 如果按下 Go 按钮在应用程序终止时关闭应用程序,则您使用的是错误的 IDE。
2赞 dmckee --- ex-moderator kitten 3/27/2010
之前在这里问和回答:stackoverflow.com/questions/902261/...,尽管这个标题更好。

答:

137赞 James McNellis 3/27/2010 #1

编辑:正如查尔斯·贝利(Charles Bailey)在下面的评论中正确指出的那样,如果其中有字符缓冲,这将不起作用,并且实际上没有很好的方法可以解决这个问题。如果在连接调试器的情况下运行,则 John Dibling 建议的解决方案可能是解决问题的最干净的解决方案。stdin

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


在函数结束时,您可以调用 std::getchar();main

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

您需要 .#include <cstdio>getchar

评论

17赞 CB Bailey 3/27/2010
getchar不能解决问题 - 或者至少仅在有限的情况下。它从 读取一个字符,但是如果已经有从 stdin 缓冲的字符,则无论您是否打印提示,程序都将继续运行,而无需等待。stdin
1赞 James McNellis 3/27/2010
@Charles:说得好。忽略 until 是部分解决方案,但如果缓冲了多行输入,则无济于事。我不知道一种标准的 C++ 方法可以从输入流中清除所有内容。:-/\n
1赞 GManNickG 10/3/2010
@James:老了,但是怎么样?从这里得到它。std::cin.ignore(std::cin.rdbuf()->in_avail());
1赞 Xeo 1/29/2011
我经常使用的一个选项是 .std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');#include <limits>
6赞 Lightness Races in Orbit 12/23/2011
请不要这样做。:(这样做不是程序功能的一部分。
133赞 codaddict 3/27/2010 #2

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

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

  system("pause");

这将运行命令,该命令会等待您按下一个键,并显示一条不错的消息pausePress any key to continue . . .

评论

2赞 Dave Van den Eynde 3/27/2010
这听起来像是鲁布·戈德堡(Rube Goldberg)解决方案的变体。
5赞 Billy ONeal 3/27/2010
@Dave Van den Eynde:它也很常见,并且是 DevCPP 样板代码的标准配置。+1
5赞 Martin Beckett 3/28/2010
@Dave另一方面,它确实清楚地表明这只是一个例子,而 std:getch 可能会意外地留在实际代码中。
2赞 thecoshman 10/10/2012
对于Windows用户来说,这是一个完全有效的解决方案。虽然不理想,但它确实有效
0赞 CodyBugstein 12/18/2013
最简单、最快捷的解决方案。正是我需要的
16赞 Amos 3/27/2010 #3

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

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

评论

3赞 Billy ONeal 3/27/2010
因为如果您使用的是 IDE,则通常不会使用控制台。你按下 go,程序运行,仅此而已。
3赞 3/27/2010
当应用程序终止时,任何称职的 IDE 都会将控制台保持在屏幕上 - 例如,Code::Blocks 正是这样做的。
3赞 James McNellis 3/28/2010
@nobugz:我想通了。若要使窗口保留,必须在链接器命令行上安装 /SUBSYSTEM:CONSOLE。文档说这是默认的 if 被定义,但如果我没有在命令行上显式设置它,VS 会在应用程序退出时终止窗口。叹息main
2赞 Hans Passant 3/28/2010
@James:这是首先获取控制台窗口所必需的。这反过来需要 main() 而不是 WinMain(),而不是相反。我有点迷茫......
4赞 James McNellis 3/28/2010
@nobugz:如果从“空项目”而不是“Win32 控制台应用程序”启动,则不会在项目属性中显式设置子系统。如果在项目中定义,则链接器默认使用 CONSOLE 子系统。调试或运行时,你将获得一个控制台窗口。但是,除非在项目属性中显式指定 CONSOLE 作为子系统,否则 Visual Studio 不会使控制台窗口保持打开状态。我总是从一个空项目开始,我很少更改单个项目属性,所以我从未见过控制台窗口一直存在。很抱歉造成混乱main
0赞 Tronic 3/27/2010 #4

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

4赞 anon 3/27/2010 #5

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

143赞 nabulke 3/27/2010 #6

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

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

评论

1赞 CodyBugstein 12/18/2013
从 IDE 中启动控制台?你会如何以及为什么这样做?
1赞 Luminaire 6/9/2017
太好了,它奏效了。为什么这不是 Visual Studio 的默认行为?
0赞 KansaiRobot 8/2/2017
我也认为这是这样做的方法,直到今天,当我构建一个简单的控制台程序时,上述方法不起作用:(
1赞 luckyging3r 3/18/2020
是否有调试版本?
2赞 Kate Gregory 3/27/2010 #7

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

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

3赞 DigitalZebra 3/28/2010 #8

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

无论如何,您可以像其他人建议的那样在程序末尾添加废话,或者只需按 CTRL + F5(开始而不调试),Visual Studio 将在完成后离开控制台。

如果要运行调试版本并且不向代码添加废话,另一个选项是打开控制台窗口(“开始”->“运行”-> cmd)并导航到“调试”输出目录。然后,只需输入可执行文件的名称,它就会在控制台中运行您的调试程序。然后,如果确实需要,可以使用 Visual Studio 的附加到进程或其他东西。

20赞 John Dibling 3/28/2010 #9

我通常只是在右大括号上放一个断点。当通过任何方式到达程序结束时,断点将命中,您可以按 Alt-Tab 键转到控制台窗口以查看输出。main()

2赞 Thomas Matthews 3/28/2010 #10

在 中 的任何函数或任何 s 之前添加以下行:exit()returnmain()

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

评论

0赞 Qwertie 1/22/2014
这对我不起作用,第一行有效,但按回车键什么也没做
-3赞 Roman A. Taycher 3/28/2010 #11

你也可以坚持下去

while(true)
    ;

for(;;)
    ;

在最后。

评论

2赞 Nathan 3/30/2013
-1 繁忙的旋转是邪恶的。它们会消耗您的 CPU 周期,却一事无成。如果你打算做这样的事情,至少在循环体内发出暂停的调用,以产生你的大部分周期。
-1赞 Izza 5/31/2010 #12

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

86赞 Mr. Underhill 1/29/2011 #13

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

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

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

评论

1赞 Jesse Pepper 3/14/2012
如果它不是控制台应用,该怎么办?
3赞 Jonathan Mee 12/18/2014
@Mr.Underhill 这仅在不使用调试器 (Ctrl+F5) 的情况下启动时才有效。
0赞 Poniros 4/13/2019
除了是唯一的非黑客解决方案之外,这也是从主堆栈对象析构函数查看打印的唯一方法。
3赞 Bat_Programmer #14

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

cin.get();
0赞 Northcode 1/1/2012 #15

这似乎效果很好:

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

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

评论

1赞 Konrad Rudolph 1/1/2012
2 有时也不够(当排队的击键次数较多时)。正确的方法是忽略队列中尽可能多的字符。与, .不是像 1 或 2 这样的神奇数字。cin.rdbuf()->in_avail
9赞 tsx 6/17/2012 #16

通话 2 次:cin.get();

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

评论

0赞 QMaster 6/16/2015
如果在此之前我们需要另一个 cin.get() 来获取数组中的一些字符串怎么办?在这种情况下不起作用。
-1赞 Friendly advice 9/17/2012 #17

你所要做的就是为 x 设置一个变量,然后在返回 0 之前输入它;

cout<<"\nPress any key and hit enter to end...";
cin>>x;
12赞 robert 2/10/2013 #18

在代码末尾之前,插入以下行:

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
}

评论

0赞 PapaHotelPapa 5/26/2016
它还打印了“按任意键继续......”给我的。
1赞 madladzen 10/26/2020
如果您希望它暂停但不将文本输出到控制台,您可以这样做,说“按任意键继续......”system("pause > nul");
0赞 yeh 5/14/2013 #19

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

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

评论

0赞 madladzen 10/26/2020
这是一个糟糕的解决方案,而且是糟糕的批处理代码。更好的解决方案是只使用system("pause >nul")
0赞 PatThaCoder 11/21/2013 #20

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

0赞 lierosk 12/18/2014 #21

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

评论

1赞 Ravi Dhoriya ツ 12/18/2014
这并不能提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您有足够的声誉,您就可以对任何帖子发表评论
1赞 lierosk 12/18/2014
这怎么不提供答案?我的情况与问题的作者完全相同,这很有帮助。
2赞 Dmitriy Suserov 12/19/2014 #22

只是

#include <cstdio>

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

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

评论

2赞 kaya3 11/14/2019
请至少添加一个简短的解释,说明为什么这样可以解决问题。
-2赞 Ali Asgari 1/15/2015 #23

在代码末尾,在 之前包含 和conio.hreturn 0_getch();

-5赞 kamatsahas 5/5/2015 #24

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

而(1){ }

此功能将永远持续(或直到您关闭控制台),并防止控制台自行关闭。

-3赞 Daan 5/18/2015 #25

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

2赞 MicroVirus 5/19/2015 #26

对于 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();

请注意,这使用宏与多个“字符集”(VC++ 称之为字符集)兼容。tchar.h

0赞 QMaster 6/16/2015 #27

我用过,这很有效,但有一天我需要在此之前使用另一个来抓住中间有空白字符的绳子。因此,没有避免命令提示符窗口关闭。最后我找到了另一种方法: 按 CTRL+F5 在外部窗口中打开,Visual Studio 不再控制它。只是在最终命令运行后会询问您有关关闭的问题。cin.get()cin.get([Array Variable])cin.get()

4赞 GuestPerson00001 12/12/2015 #28

我只是这样做:

//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 更好,但它有点啰嗦,通常没有必要。

评论

0赞 Standard 11/21/2016
它有效,但返回 0;如果我使用此代码,则不会执行。
0赞 user5657236 12/12/2015 #29

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

0赞 anony 4/3/2016 #30

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

2赞 Mohammed Nouh 2/14/2017 #31

使用&就像下面的代码一样。#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");
}

评论

0赞 melpomene 1/7/2019
system声明在 中,而不是 。<cstdlib>stdafx.h
0赞 madladzen 10/26/2020
也更好,因为它不会打印出“按任意键继续......”system("pause >nul")
1赞 Cœur 3/20/2017 #32

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

创建包含以下内容的批处理文件:

helloworld.exe
pause

然后使用批处理文件。

0赞 Zen Of Kursat 8/28/2017 #33

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

main()
  {
  //your codes 

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

  return 0;
  }

就这样

评论

0赞 aj.toulan 1/22/2018
我通常这样做。cin.ignore();cin.get();
0赞 9/8/2021
您能详细说明为什么需要两次吗?
0赞 prigadiri 12/19/2020 #34

您也可以尝试这样做

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

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

0赞 zipzit 2/23/2021 #35

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

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

显然,系统将最后一行断点视为“第一个”停止点。简单的解决方法?删除该断点,呵呵!(在此处插入额头拍打。

0赞 sharkwire 10/16/2023 #36

在我为OpenCV C++开发设置Visual Studio后,我遇到了这个问题(更像是一个功能而不是问题)。我必须启用控制台的自动关闭。当运行在控制台中返回输出的普通 C++ 程序时,它会立即关闭。 我在另一个问题中找到了解决方案,它奏效了:

https://stackoverflow.com/a/54084067/15012520

转到Tools >> Options >> Debugging >> General >> Automatically close the console when debugging stops.