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

193

Ú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 evitar que el programa se cierre inmediatamente para que pueda ver los frutos de mi esfuerzo?

Adam P
fuente
55
¿Estás haciendo doble clic en el ejecutable? ¿Estás trabajando en Windows? ¿Por qué no estás trabajando desde el shell de comandos y escribiendo los comandos como quieres que se ejecuten?
S.Lott
8
@S Lott: Porque si presiona el botón "Ir" en su IDE, no necesita molestarse con una consola.
Billy ONeal
44
Debería considerar obtener un buen libro para aprender C ++. Los sitios web son buenos recursos, pero no son rival para un buen texto introductorio. Aquí hay una lista definitiva de libros de C ++: stackoverflow.com/questions/388242/…
James McNellis
66
@Billy Si al presionar el botón Ir se cierra la aplicación cuando finaliza, está utilizando el IDE incorrecto.
2
Preguntado y respondido anteriormente aquí: stackoverflow.com/questions/902261/… , aunque este tiene un mejor título.
dmckee --- ex-gatito moderador

Respuestas:

121

Editar: como Charles Bailey señala correctamente en un comentario a continuación, esto no funcionará si hay caracteres almacenados stdin, y realmente no hay una buena manera de evitarlo. Si está ejecutando con un depurador conectado, 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 una especie de truco rápido al escribir pruebas durante el desarrollo.


Al final de su mainfunción, puede llamarstd::getchar();

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

Necesitas #include <cstdio>para getchar.

James McNellis
fuente
15
getcharno resuelve el problema, o solo en circunstancias limitadas, al menos. Lee un carácter de stdin, pero si ya hay caracteres almacenados en búfer desde stdin, el programa continuará sin esperar, independientemente de si imprime un mensaje o no.
CB Bailey
1
@ Charles: Un buen punto. Ignorar hasta \nes una solución parcial, pero no ayudará si se almacena más de una línea de entrada. No conozco una forma estándar de C ++ para borrar todo de una secuencia de entrada. : - /
James McNellis
1
@ James: Viejo, pero ¿qué tal std::cin.ignore(std::cin.rdbuf()->in_avail());? Lo tengo desde aquí .
GManNickG
1
Una opción que uso mucho es std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');con #include <limits>.
Xeo
55
Por favor no hagas esto. :( No es parte de la función de su programa para hacer esto.
Luminosidad razas en órbita
138

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

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

nabulke
fuente
1
¿Iniciar la consola fuera del IDE? ¿Cómo y por qué harías eso?
CodyBugstein
1
Excelente, funcionó. ¿Por qué este no es el comportamiento predeterminado de Visual Studio?
Luminaria
También pensé que esa era la forma de hacerlo, hasta hoy, cuando construí un programa de consola simple y el método anterior no funcionó :(
KansaiRobot
1
¿Hay una versión de esto con depuración?
luckyging3r
109

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

Alternativamente Windows, también puede agregar lo siguiente justo antes de regresar de la mainfunción:

  system("pause");

Esto ejecutará el pausecomando que espera hasta que presione una tecla y también muestra un mensaje agradablePress any key to continue . . .

codictorio
fuente
2
Eso suena como una variación de Rube Goldberg de una solución.
Dave Van den Eynde
44
@Dave Van den Eynde: También es bastante común y viene estándar en el código repetitivo en DevCPP. +1
Billy ONeal
44
@Dave, por otro lado, deja en claro que esto es solo un cambio para un ejemplo, mientras que std: getch podría dejarse accidentalmente en código real.
Martin Beckett
2
Esta es una solución perfectamente válida para aquellos en Windows. Si bien no es ideal, funciona
thecoshman
La solución más fácil y rápida. Justo lo que necesitaba
CodyBugstein
83

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 finalizado, eche un vistazo a este hilo de MSDN .

Probablemente 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 sugirió el moderador de Microsoft:

Haga clic con el botón derecho en el nombre de su proyecto y vaya a la página Propiedades, expanda Propiedades de configuración -> Enlace -> Sistema, seleccione Consola (/ SUBSISTEMA: CONSOLA) en el menú desplegable del subsistema. Porque, por defecto, el proyecto Vacío no lo especifica.

Señor underhill
fuente
1
¿Qué pasa si no es una aplicación de consola?
Jesse Pepper
3
@ Mr.Underhill Esto solo funcionará si inicia sin el depurador (Ctrl + F5).
Jonathan Mee
Además de ser la única solución no pirateada, esta también es la única forma de ver las impresiones de los destructores de objetos de la pila principal.
Poniros
20

Por lo general, solo pongo un punto de interrupción en main()la llave de cierre. Cuando se llega al final del programa por cualquier medio, el punto de interrupción alcanzará y puede ALT-Tab a la ventana de la consola para ver la salida.

John Dibling
fuente
14

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

[EDITAR]: 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.

Amós
fuente
3
Porque si está usando un IDE, generalmente no usa una consola. Presiona Go, el programa se ejecuta, y eso es todo.
Billy ONeal
3
Cualquier IDE competente mantendrá la consola en la pantalla cuando la aplicación finalice; Code :: Blocks, por ejemplo, hace exactamente esto.
3
@nobugz: lo descubrí. Para que la ventana permanezca, debe tener / SUBSYSTEM: CONSOLE en la línea de comando del enlazador. La documentación dice que este es el valor predeterminado si mainestá definido, pero si no lo configuro explícitamente en la línea de comando, VS mata la ventana cuando la aplicación sale. suspiro
James McNellis
2
@ James: eso es necesario para obtener una ventana de consola en primer lugar. Eso a su vez requiere main () en lugar de WinMain (), no al revés. Estoy un poco perdido ...
Hans Passant
44
@nobugz: si comienza desde un "Proyecto vacío" en lugar de una "Aplicación de consola Win32", el subsistema no se establece explícitamente en las propiedades del proyecto. Si define mainen el proyecto, el vinculador por defecto utiliza el subsistema CONSOLA. Al depurar o ejecutar, obtendrá una ventana de consola. Sin embargo, a menos que especifique explícitamente CONSOLE como el subsistema en las propiedades del proyecto, Visual Studio no mantendrá abierta la ventana de la consola. Siempre comienzo desde un proyecto vacío y rara vez cambio las propiedades individuales del proyecto, por lo que nunca he visto que la ventana de la consola se quede. Perdón por la confusión
James McNellis
9

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

system("pause");

Esto mantendrá la consola hasta que pulses 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
}
robert
fuente
También imprimió "Presione cualquier tecla para continuar..." para mi.
PapaHotelPapa
8

Llamar cin.get();2 veces:

    //...
    cin.get();
    cin.get();
    return 0
}
tsx
fuente
66
pero ¿por qué dos veces?
Madhawa Priyashantha
¿Qué pasa si necesitamos otro cin.get () para obtener, por ejemplo, alguna cadena dentro de la matriz antes de esto? No es trabajo en este escenario.
QMaster
4

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 un código especial para mantener abierta la consola, ya que esto evitará que funcione correctamente cuando la use de manera real, fuera del IDE.


fuente
3

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 lo sugieren otros, o simplemente puede presionar CTRL + F5 (comenzar 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 navegar a su directorio de salida de depuración . Luego, solo ingrese el nombre de su ejecutable y ejecutará su programa de depuración en la consola. Luego puede usar el adjunto de Visual Studio para procesar o algo si realmente lo desea.

Polaris878
fuente
3
#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á.

Ruan
fuente
Agregaría que conio.hes un encabezado específico de Windows y puede que no esté disponible en todas las máquinas (o puede que necesite vincularlo por separado, lo cual es una exageración).
Yksisarvinen
Trabajando. solo necesitaba cambiar getch (); _getch (); desde que quedó obsoleto
ncesar
2

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 Iniciar sin depurar en los menús (generalmente está en el menú Depurar, lo 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, navegue a la carpeta donde está su exe y ejecútelo escribiendo su nombre. De esa manera, cuando termine 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.

Kate Gregory
fuente
2

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

cin.get();
Bat_Programmer
fuente
2

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

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
Thomas Matthews
fuente
Esto no funciona para mí, la primera línea funciona, pero presionar enter no hace nada
Qwertie
2

Para Visual Studio (y solo Visual Studio), el siguiente fragmento de código le da un mensaje de 'espera para que la pulsación de tecla continúe' que realmente espera que el usuario presione una nueva tecla explícitamente, primero enjuagando 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 usa las tchar.hmacros para ser compatibles con múltiples 'juegos de caracteres' (como los llama VC ++).

Microvirus
fuente
2

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: borrar el búfer cin y tal solo es necesario si ha usado cin en algún momento anteriormente en su programa. También usar std :: numeric_limits :: max () es probablemente mejor que INT_MAX, pero es un poco prolijo y generalmente innecesario.

GuestPerson00001
fuente
Funciona, pero el retorno 0; no se ejecutará si uso este código.
wernersbacher
2

Use #include "stdafx.h"y 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");
}
Mohammed Nouh
fuente
systemse declara en <cstdlib>, no stdafx.h.
melpomene
1

Idea similar a la respuesta de yeh , solo una alternativa minimalista.

Cree un archivo por lotes con el siguiente contenido:

helloworld.exe
pause

Luego use el archivo por lotes.

Coeur
fuente
1

simplemente

#include <cstdio>

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

por alguna razón, generalmente hay 1 carácter posible para leer con getchar ya en stdin cuando ejecuta un programa. entonces el primer getchar lee este carácter, y el segundo getchar espera la entrada del usuario (su) antes de salir del programa. Y después de que un programa sale de la mayoría de las terminales, especialmente en Windows, cierre la terminal de inmediato. Entonces, nuestro objetivo es una manera simple de evitar que un programa termine después de que lo emite todo. Por supuesto, hay formas más complejas y limpias de resolver esto, pero esta es la más simple.

Dmitriy Suserov
fuente
2
Agregue al menos una breve explicación de por qué esto resuelve el problema.
kaya3
0

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 finalice el programa. Si no, use std::cin.get();para leer un carácter al final de la función principal. Sin embargo, asegúrese de usar solo la entrada basada en líneas (std :: getline) o de tratar los caracteres no leídos restantes de otra manera (std :: ignore hasta nueva línea) porque de lo contrario el .get () al final solo leerá la basura que dejó sin leer antes.

Tronic
fuente
0

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.

Northcode
fuente
1
2 a veces tampoco es suficiente (cuando hay más pulsaciones de tecla en cola). La forma correcta es ignorar tantos caracteres como haya en la cola. Para con cin.rdbuf()->in_avail,. No es un número mágico como 1 o 2.
Konrad Rudolph
0

Siempre puedes crear un archivo por lotes. Por ejemplo, si su programa se llama helloworld.exe, algunos códigos serían:

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

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

PatThaCoder
fuente
0

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

lierosk
fuente
1
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente reputación podrá comentar cualquier publicación .
Ravi Dhoriya ツ
1
¿Cómo esto no proporciona respuesta? Estoy exactamente en la misma situación como autor de una pregunta y esto ayuda.
lierosk
0

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

QMaster
fuente
0

Intenté poner una getchar()función al final. Pero no funcionó. Entonces, lo que hice fue agregar dos getchar()funciones una tras otra. Creo que el primero getchar()absorbe la Entertecla que presiona después de la última entrada de datos. Intente agregar dos getchar()funciones en lugar de una

Nathan Tuggy
fuente
0

En lugar de presionar el botón Ejecutar, presione CTRL y F5 al mismo tiempo, le dará presionar cualquier tecla para continuar el 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 use esto solo para probar programas no reales ya que los antivirus no no me gusta !!!!)

anony
fuente
0

simplemente use cin.ignore () justo antes de devolver 0; dos veces

main()
  {
  //your codes 

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

  return 0;
  }

eso es todo

Kursat Turkay
fuente
Normalmente hago esto como esto. cin.ignore (); cin.get ();
aj.toulan
-1

Todo lo que tiene que hacer es establecer una variable para x y luego escribir esto antes del retorno 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;
Consejo amistoso
fuente
-1

Incluso puede declarar un número entero al comienzo de su main()función (digamos int a;) y colocarlo std::cin >> a;justo antes del valor de retorno. Entonces el programa seguirá ejecutándose hasta que presione una tecla e ingrese.

Izza
fuente