Evitar que la ventana de la consola se cierre en la aplicación de consola Visual Studio C / C ++


464

Esta es probablemente una pregunta embarazosa ya que sin duda la respuesta es cegadoramente obvia.

He usado Visual Studio durante años, pero esta es la primera vez que hago un desarrollo de 'Aplicación de consola'.

Cuando ejecuto mi aplicación, aparece la ventana de la consola, aparece la salida del programa y luego la ventana se cierra a medida que la aplicación sale.

¿Hay alguna manera de mantenerlo abierto hasta que haya verificado el resultado, o ver los resultados una vez que se ha cerrado la ventana?


Monodevelop hace lo que esperas.
ctrl-alt-delor

3
Hay demasiadas respuestas a continuación, así que copio una respuesta aquí: si está usando VS2017, entonces Herramientas-> Opciones-> Depuración-> Cerrar automáticamente la consola
jw_

Convenido. Creo que la mejor respuesta para VS 2017 y más reciente es la de chronoxor.
Toda la ira del

Respuestas:


466

Si ejecuta sin depuración (Ctrl + F5), de manera predeterminada, le pedirá que presione Intro para cerrar la ventana. Si desea utilizar el depurador, debe poner un punto de interrupción en la última línea.


268
Si tiene una aplicación C ++ y se ejecuta sin depurar y la ventana de la consola aún se cierra, debe recordar configurar explícitamente el subsistema a la consola en Propiedades de configuración / Enlace / Sistema. Esto puede suceder si comienza con un Proyecto vacío, que deja el Subsistema sin configurar.
Trevor Robinson el

44
No funcionó para mí :( La ventana de la consola se abre y se cierra inmediatamente, pero el registro se detiene y espera una presión adicional de F5
CodyBugstein

40
La respuesta correcta es la de @TrevorRobinson: aquí está la versión ampliada si tiene problemas para descubrir dónde están las propiedades de configuración: haga clic con el botón derecho en su proyecto en Visual Studio> Propiedades> Propiedades de configuración> Enlace> Sistema, cambie Subsistema a " Consola "
PlagueHammer

3
Trevor Robinson tiene razón. Si inicia un proyecto en blanco y un elemento C ++. Debe ir a Ver-> Administrador de propiedades-> Propiedad (icono de llave inglesa) -> Config. Propiedades-> Enlace-> Sistema-> Subsistema-> en el menú desplegable, elija Consola.
Señor más venerable

10
Estoy trabajando en VS community 2017. ctrl+f5no funciona, no hay nada Propertiescuando hago clic con el botón derecho en el proyecto, también wrench iconestá atenuado.
Ketan

232

Haga clic derecho en su proyecto

Propiedades> Propiedades de configuración> Vinculador> Sistema

Seleccione la consola (/ SUBSYSTEM: CONSOLE) en la SubSystemopción o simplemente escriba Console en el campo de texto.

Ahora inténtalo ... debería funcionar


Esto funcionó para mi VS2013 Express, pero la respuesta aceptada no. Muy extraño, ya que la respuesta aceptada ha funcionado para todas las versiones de Visual Studio que he usado en el pasado.
Michael Calvin

99
@MichaelCalvin Tienes que correr con Ctrl + F5 después de configurar esto, ese es el truco.
Jonathan Mee el

como @JonathanMee declaró que todavía ha ejecutado Ctrl + F5. Esto ya estaba configurado en mi estudio visual 2015, por lo que la primera respuesta fue la que más me ayudó.

Esto es de hecho correcto. Lo familiar CTRL+F5fallará si, por ejemplo, agrega un nuevo archivo C ++ a un proyecto vacío.
user2023370

Trabajó para mí en Visual Studio Express 2015. Gracias.
LHC

44

Aquí hay una forma de C / C ++:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

Ponga esto en la parte superior de su programa, y ​​SI está en un sistema Windows ( #ifdef _WIN32), creará una macro llamada WINPAUSE. Siempre que desee que su programa haga una pausa, llame WINPAUSE;y pausará el programa, utilizando el comando DOS. Para otros sistemas como Unix / Linux, la consola no debería cerrarse al salir del programa de todos modos.


Este método no funciona en Visual C ++ (a menos que incluya algún encabezado?)
wmac

2
@wmac Tienes que incluir el encabezado windows.h
Geowil

1
No incluí ninguna biblioteca o espacio de nombres pero se ejecutó correctamente, muchas gracias.
Halil İbrahim Oymacı

1
No hagas eso, por favor. El pausecomando es específico de Windows.
firegurafiku

Trabajó para mí en Visual Studio 2013 Express. :)
Anirban

32

Ir al menú de depuración-> Presione Inicio sin depuración


Esto ni siquiera es una opción en VS 2008 a menos que se elija C # Development Environment. Sin embargo, CTRL + F5 funciona. También puede agregar esto como un botón a la barra de herramientas a través de Herramientas> Personalizar.
Perry

Si tiene varios proyectos, configure el relevante como proyecto de inicio
CAD bloke

27

Si está utilizando .NET, coloque Console.ReadLine()antes del final del programa.

Se esperará <ENTER>.


99
+1: O eso o Console.ReadKey()simplemente esperar cualquier tecla.
Fredrik Mörk el

Extraño, esto no tiene efecto en mi aplicación. Todavía se cierra sin esperar la entrada del usuario.
Kokodoko

44
Entonces, es muy probable que su código salga antes de llegar a ese punto.
De hecho, el

20

A partir de Visual Studio 2017 (15.9.4) hay una opción:

Tools->Options->Debugging->Automatically close the console

El fragmento correspondiente de la documentación de Visual Studio :

Cierra automáticamente la consola cuando se detiene la depuración:

Le dice a Visual Studio que cierre la consola al final de una sesión de depuración.


2
Acabo de probar esto en VS2017 y VS2019. Requiere tanto configurar el subsistema como CONSOLA y desactivar esta opción. Tener uno u otro o ninguno cierra la ventana automáticamente.
Casey

Esto todavía cierra la ventana para mí si inicio múltiples proyectos desde la misma solución.
Serge Rogatch el

Siento que esta es la respuesta correcta para VS 2017 y adelante. Lástima que no esté en versiones anteriores.
All the Rage

13

intente llamar getchar()justo antes de main()regresar.


No funciona en VS 2008 para una sencilla aplicación de consola Hello Name. cout, cin, cout, getchar (), la consola aún se cierra. ¿Cual es el trato?
Perry

1
Intenta poner getchar () dos veces si tienes una aparición justo antes de getchar (). getchar () espera un char y ya lo está dando con cout ... Avíseme si esto ayuda :)
Magarusu

12

(/ SUBSYSTEM: CONSOLE) no funcionó para mi vs2013 (ya lo tenía).

"ejecutar sin depurar" no es una opción, ya que no quiero cambiar entre depurar y ver resultados.

Terminé con

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

Solución utilizada en qtcreator pre 2.6. Ahora, mientras qt está creciendo, vs va por otro lado. Como recuerdo, en vs2008 no necesitábamos tales trucos.


7

Aquí hay una solución que (1) no requiere ningún cambio de código o puntos de interrupción, y (2) hace una pausa después de la finalización del programa para que pueda ver todo lo que se imprimió. Pausará después de F5 o Ctrl + F5. El principal inconveniente es que en VS2013 Express (como se probó), no carga símbolos, por lo que la depuración es muy restringida.

  1. Crea un archivo por lotes. Llamé al mío runthenpause.bat, con los siguientes contenidos:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause

    La primera línea ejecutará cualquier comando que proporcione y hasta ocho argumentos. La segunda línea ... pausará.

  2. Abrir las propiedades del proyecto | Propiedades de configuración | Depuración

  3. Cambie "Argumentos de comando" a $(TargetPath)(o lo que esté en "Comando").
  4. Cambie "Comando" a la ruta completa a runthenpause.bat.
  5. Presiona OK.

Ahora, cuando ejecute, runthenpause.batiniciará su aplicación, y después de que su aplicación haya finalizado, hará una pausa para que vea la salida de la consola.

Publicaré una actualización si descubro cómo cargar los símbolos. Lo intenté /Z7por esto pero sin éxito.


1
Esto todavía no admite la depuración, pero al menos aborda el problema de no poder ver la salida, por ejemplo, de VLD, en contraste con todas las otras respuestas.
Martin Hennings


3

Puede ejecutar su ejecutable desde un símbolo del sistema. De esta manera podría ver toda la salida. O podrías hacer algo como esto:

int a = 0;
scanf("%d",&a);

return YOUR_MAIN_CODE;

y de esta manera la ventana no se cerrará hasta que ingrese datos para la avariable.


3

agregar "| pausa "en el cuadro de argumentos del comando en la sección de depuración en las propiedades del proyecto.


44
Esta sería una gran solución si funcionara. pauseparece que solo funciona en archivos por lotes, y aunque recibe información de su programa en STDIN, no vuelve a imprimir ese texto. Intenté reemplazarlo |con &&, pero no tuvo ningún efecto, presumiblemente porque no se está ejecutando con un shell de comandos (cmd.exe).
Brian Vandenberg

3

Simplemente presione CNTRL + F5 para abrirlo en una ventana de línea de comando externa (Visual Studio no tiene control sobre él).

Si esto no funciona, agregue lo siguiente al final de su código:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Esto espera a que presione una tecla para cerrar la ventana del terminal una vez que el código haya llegado al final.

Si desea hacer esto en varios lugares, coloque el código anterior en un método (por ejemplo private void Pause()) y llame Pause()siempre que un programa llegue a un posible final.


cuando hago cntrl + f5 se abre y luego se cierra de inmediato? como arreglas eso
Callat

¡La segunda solución era lo que estaba buscando!
RoG

Cuando presiono Ctrl + F5, no pasa nada. Solía ​​funcionar para mí, pero de repente dejó de funcionar.
Natasha

2

Una solución algo mejor:

atexit([] { system("PAUSE"); });

Al comienzo de su programa.

Pros:

  • puede usar std :: exit ()
  • puede tener múltiples retornos desde main
  • puedes ejecutar tu programa bajo el depurador
  • IDE independiente (+ OS independiente si usa el cin.sync(); cin.ignore();truco en lugar de system("pause");)

Contras:

  • tener que modificar el código
  • no se detendrá en std :: terminate ()
  • seguirá sucediendo en su programa fuera de la sesión IDE / depurador; puedes evitar esto en Windows usando:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}

Muy mal consejo.
Saludos y hth. - Alf

¿Puedes explicar por qué?
GhassanPL

En el caso de que uno no esté depurando, no hace nada útil, porque en este caso no hay ningún problema que resolver. En VS simplemente ejecute el programa con Ctrl + F5 y listo, así que no hay problema en VS, y en un intérprete de comandos no hay problema, en resumen, no hay problema. Y en el caso de que uno esté depurando y quiera que se detenga un código agregado para detener, no es una solución más conveniente que un punto de interrupción e interfiere en las situaciones en las que no se desea detener.
Saludos y hth. - Alf

2

Cualquier uso:

  1. cin.get();

o

  1. system("pause");

Asegúrese de hacer cualquiera de ellos al final de la main()función y antes de la returndeclaración.


2

También puedes usar esta opción

#include <conio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
   .
   .
   .
   getch(); 

   return 0;
}

2

En mi caso, experimenté esto cuando creé un proyecto Empty C ++ en la edición comunitaria VS 2017. Deberá configurar el Subsistema en "Consola (/ SUBSISTEMA: CONSOLA)" en Propiedades de configuración.

  1. Vaya a "Ver" y luego seleccione "Administrador de propiedades"
  2. Haga clic derecho en el proyecto / solución y seleccione "Propiedad". Esto abre una página de propiedades de prueba
  3. Navegue hasta el enlazador y luego seleccione "Sistema"
  4. Haga clic en "Subsistema" y aparecerá un menú desplegable
  5. Elija "Consola (/ SUBSISTEMA: CONSOLA)"
  6. Aplicar y guardar
  7. La próxima vez que ejecute su código con "CTRL + F5", debería ver el resultado.

0

Visual Studio 2015 , con importaciones . Porque odio cuando los ejemplos de código no dan las importaciones necesarias.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.