¿Cómo evitar que la aplicación de consola de C++ salga inmediatamente?


Últimamente, he estado tratando de aprender C++ de este sitio web. Desafortunadamente cada vez que intento ejecutar uno de los ejemplos de código, veo que el programa se abre durante aproximadamente medio segundo y luego se cierra inmediatamente. ¿Hay alguna manera de detener el cierre inmediato del programa para que pueda ver los frutos de mi esfuerzo?

Author: Peter Mortensen, 2010-03-27

30 answers

Editar: Como Charles Bailey señala acertadamente en un comentario a continuación, esto no funcionará si hay caracteres almacenados en búfer en stdin, y realmente no hay una buena manera de evitarlo. Si está ejecutando con un depurador adjunto, La solución sugerida por John Dibling es probablemente la solución más limpia para su problema.

Dicho esto, dejaré esto aquí y tal vez alguien más lo encuentre útil. Lo he usado mucho como un truco rápido de clases al escribir pruebas durante desarrollo.


Al final de su función main, puede llamar std::getchar();

Esto obtendrá un solo carácter de stdin, lo que le dará el tipo de comportamiento de "presionar cualquier tecla para continuar" (si realmente desea un mensaje de "presionar cualquier tecla", tendrá que imprimir uno usted mismo).

Necesitas #include <cstdio> para getchar.

 105
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:47

Si está utilizando Visual Studio y está iniciando la aplicación de consola desde el IDE:

Presionando CTRL-F5 (iniciar sin depurar) iniciará la aplicación y mantendrá la ventana de la consola abierta hasta que presione cualquier tecla.

 128
Author: nabulke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 15:20:25

La solución de James funciona para todas las Plataformas.

Alternativamente en Windows también puede agregar lo siguiente justo antes de regresar de la función main:

  system("pause");

Esto ejecutará el comando pause que espera hasta que presione una tecla y también muestra un mensaje agradable Press any key to continue . . .

 88
Author: codaddict,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 15:04:33

Si está utilizando Visual C++ 2010 Express de Microsoft y se encuentra con el problema de que CTRL+F5 no funciona para mantener la consola abierta después de que el programa haya terminado, eche un vistazo a este hilo de MSDN.

Es probable que su IDE esté configurado para cerrar la consola después de ejecutar CTRL+F5; de hecho, un "Proyecto vacío" en Visual C++ 2010 cierra la consola de forma predeterminada. Para cambiar esto, haga lo que el moderador de Microsoft sugirió:

Por favor haga clic derecho en el nombre de su proyecto y vaya en la página Propiedades, expanda Propiedades de configuración - > Enlazador - > Sistema, seleccione Consola (/SUBSISTEMA: CONSOLA) en el menú desplegable Subsistema. Porque, de forma predeterminada, el proyecto vacío no lo especifica.

 69
Author: Mr. Underhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 20:52:21

Normalmente solo pongo un punto de interrupción en el corsé rizado de cierre de main(). Cuando se alcanza el final del programa por cualquier medio, el punto de interrupción llegará y puede ALT-Tab en la ventana de la consola para ver la salida.

 18
Author: John Dibling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 16:08:38

¿Por qué no ejecutar el programa desde una consola, es decir, ejecutar el programa desde cmd?exe si estás usando Windows. De esta manera la ventana permanece abierta después de que el programa termine.

[EDIT]: Cuando uso KDevelop4 hay una instancia completa de Bash (una CLI de Linux) ejecutándose en una pestaña en la parte inferior del IDE. Que es lo que uso en este tipo de circunstancias.

 13
Author: Amos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 16:39:00

Llama cin.get(); 2 veces:

    //...
    cin.get();
    cin.get();
    return 0
}
 8
Author: tsx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-17 15:25:03

Antes del final de su código, inserte esta línea:

system("pause");

Esto mantendrá la consola hasta que toque una tecla.

#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
}
 8
Author: robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 17:54:47

Si ejecuta su código desde un IDE competente, como Code::Blocks, el IDE administrará la consola que utiliza para ejecutar el código, manteniéndolo abierto cuando se cierre la aplicación. No desea agregar código especial para mantener la consola abierta, porque esto evitará que funcione correctamente cuando la use de verdad, fuera del IDE.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 14:51:00

Bien, supongo que estás en Windows usando Visual Studio... ¿Por qué? Bueno, porque si estás en algún tipo de sistema operativo Linux, entonces probablemente lo estarías ejecutando desde la consola.

De todos modos, puede agregar basura al final de su programa como otros están sugiriendo, o simplemente puede presionar CTRL + F5 (iniciar sin depurar) y Visual Studio dejará la consola una vez completada.

Otra opción si desea ejecutar la versión de depuración y no agregar basura a su código es abrir la ventana de la consola (Inicio - > Ejecutar - > cmd) y vaya a su directorio de salida de depuración . Luego, simplemente ingrese el nombre de su ejecutable y ejecutará su programa de depuración en la consola. A continuación, puede utilizar Visual Studio adjuntar a proceso o algo si realmente desea.

 3
Author: Polaris878,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 16:07:53

Si realmente está depurando su aplicación en Visual C++, presione F5 o el triángulo verde en la barra de herramientas. Si realmente no lo está depurando (no tiene puntos de interrupción establecidos), presione Ctrl+F5 o elija Comenzar sin Depurar en los menús (generalmente está en el menú de depuración, que estoy de acuerdo es confuso.) Será un poco más rápido, y lo más importante para usted, se detendrá al final sin que tenga que cambiar su código.

Alternativamente, abra un símbolo del sistema, vaya a la carpeta donde está su exe, y ejecútelo escribiendo su nombre. De esa manera, cuando haya terminado de ejecutarse, el símbolo del sistema no se cierra y puede ver la salida. Prefiero ambos métodos a agregar código que detiene la aplicación justo cuando está terminada.

 2
Author: Kate Gregory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 15:21:58

Simplemente agregue lo siguiente al final de su programa. Intentará capturar alguna forma de entrada del usuario, por lo que evita que la consola se cierre automáticamente.

cin.get();
 2
Author: Bat_Programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-04 10:42:48

Agregue las siguientes líneas antes de cualquier función exit() o antes de cualquier return s en main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
 2
Author: Thomas Matthews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-04 16:57:34

Para Visual Studio (y solo Visual Studio), el siguiente fragmento de código le da un mensaje de 'esperar a que se mantenga pulsada la tecla' que realmente espera a que el usuario presione una tecla nueva explícitamente, primero limpiando el búfer de entrada:

#include <cstdio>
#include <tchar.h>
#include <conio.h>

_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();

Tenga en cuenta que esto utiliza la macro tchar.h para ser compatible con múltiples 'conjuntos de caracteres' (como VC++ los llama).

 2
Author: MicroVirus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 20:45:00

Solo hago esto:

//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;

Nota: limpiar el búfer cin y tal solo es necesario si ha utilizado cin en algún momento anterior en su programa. También usar std:: numeric_limits:: max() es probablemente mejor que INT_MAX, pero es un poco prolijo y generalmente innecesario.

 2
Author: GuestPerson00001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-11 20:36:01

Uso #include "stdafx.h" & system("pause"); al igual que el código de abajo.

#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");
}
 1
Author: Mohammed Nouh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-14 15:33:16

Idea similar a yeh respuesta, solo alternativa minimalista.

Cree un archivo por lotes con el siguiente contenido:

helloworld.exe
pause

Luego use el archivo por lotes.

 1
Author: Cœur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-19 17:21:55
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

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

    return 0;
}

No noté que nadie más publicara esto, así que aquí está.

 1
Author: Ruan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 07:11:14

Vea si su IDE tiene una casilla de verificación en la configuración del proyecto para mantener la ventana abierta después de que el programa termine. Si no, use std::cin.get(); para leer un carácter al final de la función principal. Sin embargo, asegúrese de utilizar solo la entrada basada en línea (std::getline) o para tratar con los caracteres no leídos sobrantes de lo contrario (std::ignore hasta nueva línea) porque de lo contrario el .get () al final solo leerá la basura que dejó sin leer antes.

 0
Author: Tronic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-27 14:45:33

Esto parece funcionar bien:

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

Si borra el búfer primero, no será un problema cuando lea el siguiente. Por alguna razón cin.ignore(1) no funciona, tiene que ser 2.

 0
Author: Northcode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-31 22:29:23

Todo lo que tiene que hacer es establecer una variable para x, luego simplemente escriba esto antes del retorno 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;
 0
Author: Friendly advice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-17 08:09:59

Incluso puede declarar un entero al principio de su función main() (digamos int a;) y poner std::cin >> a; justo antes del valor devuelto. Por lo tanto, el programa seguirá funcionando hasta que presione una tecla y entre.

 0
Author: Izza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 17:53:46

Siempre puede crear un archivo por lotes. Por ejemplo, si su programa se llama helloworld.exe, algún código sería:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
 0
Author: yeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 17:55:23

Estoy poniendo un punto de interrupción en el último retorno 0 del programa. Funciona bien.

 0
Author: lierosk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 20:15:31

Simplemente

int main(){
    // code...
    getchar();
    getchar();
    return 0;
}
 0
Author: Dmitriy Suserov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-19 10:26:34

Usé cin.get() y eso funciona, pero un día tuve que usar otro cin.get([Array Variable]) antes de eso para agarrar una cadena de ling con carácter en blanco en medio de. así que el cin.get() no evitó que la ventana del símbolo del sistema se cerrara. Finalmente encontré Otra manera: Pulse CTRL+F5 para abrir una ventana externa y Visual Studio ya no tiene control sobre ella. Solo le preguntará sobre el cierre después de ejecutar los comandos finales.

 0
Author: QMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-16 14:45:40

Intenté poner una función getchar() al final. Pero no funcionó. Así que lo que hice fue agregar dos funciones getchar() una tras otra. Creo que la primera getchar()absorbe la tecla Enter que presiona después de la última entrada de datos. Así que intenta agregar dos getchar() funciones en lugar de una

 0
Author: Samriddhi Sinha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-19 03:25:26

En lugar de presionar el botón ejecutar, presione CTRL y F5 al mismo tiempo, le dará la prensa cualquier tecla para continuar mensaje. O escriba " (advertencia use esto solo para probar programas no reales, ya que a los antivirus no les gusta!!!!) "al final de su función principal, pero: (advertencia utilice esto solo para probar programas no reales como un antivirus no les gusta!!!!)

 0
Author: anony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 14:47:25

Simplemente use cin.ignore () justo antes de devolver 0; twice

main()
  {
  //your codes 

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

  return 0;
  }

Eso es todo

 0
Author: Kursat Turkay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-28 16:04:09

Si está ejecutando Windows, entonces puede hacer system("pause >nul"); o system("pause");. Ejecuta un comando de consola para pausar el programa hasta que presione una tecla. >nul le impide decir Press any key to continue....

 -1
Author: PatThaCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 20:15:08