Impedire la chiusura della finestra della console nell'applicazione console di Visual Studio C / C ++


464

Questa è probabilmente una domanda imbarazzante poiché senza dubbio la risposta è palesemente ovvia.

Ho usato Visual Studio per anni, ma questa è la prima volta che ho fatto lo sviluppo di 'Console Application'.

Quando eseguo la mia applicazione, viene visualizzata la finestra della console, viene visualizzato l'output del programma e la finestra si chiude all'uscita dell'applicazione.

C'è un modo per tenerlo aperto fino a quando non ho verificato l'output o visualizzare i risultati dopo la chiusura della finestra?


Monodevelop fa quello che ti aspetti.
ctrl-alt-delor,

3
Ci sono troppe risposte qui sotto, quindi copio una risposta qui: se stai usando VS2017, quindi Strumenti-> Opzioni-> Debug-> Chiudi automaticamente la console
jw_

Concordato. Penso che la risposta migliore per VS 2017 e più recente sia quella di chronoxor.
All the Rage

Risposte:


466

Se si esegue senza debug (Ctrl + F5), per impostazione predefinita viene richiesto di premere Invio per chiudere la finestra. Se si desidera utilizzare il debugger, è necessario inserire un punto di interruzione nell'ultima riga.


268
Se si dispone di un'app C ++ ed Esegui senza debug e la finestra della console si chiude ancora, è necessario ricordare di impostare esplicitamente il sottosistema su Console in Proprietà di configurazione / Linker / Sistema. Questo può accadere se si inizia con un progetto vuoto, che lascia disinserito il sottosistema.
Trevor Robinson,

4
Non ha funzionato per me :( La finestra della console si apre e si chiude immediatamente, ma il registro si interrompe e attende una stampa aggiuntiva di F5
CodyBugstein

40
La risposta corretta è quella di @TrevorRobinson: Ecco la versione estesa se hai problemi a scoprire dove si trovano le proprietà di configurazione: Fai clic con il tasto destro del mouse sul tuo progetto in Visual Studio> Proprietà> Proprietà di configurazione> Linker> Sistema, cambia sottosistema in " Console "
PlagueHammer

3
Trevor Robinson ha ragione. Se si avvia un progetto vuoto e l'elemento C ++. Devi andare su Visualizza-> Gestore proprietà-> Proprietà (icona chiave inglese) -> Config. Proprietà-> Linker-> Sistema-> Sottosistema-> nel menu a discesa, seleziona Console.
più venerabile signore,

10
Sto lavorando su VS community 2017. ctrl+f5Non funziona, non c'è niente Propertiesquando faccio clic con il pulsante destro del mouse sul progetto, inoltre wrench iconè disattivato.
Ketan,

232

Fai clic destro sul tuo progetto

Proprietà> Proprietà di configurazione> Linker> Sistema

Selezionare Console (/ SUBSYSTEM: CONSOLE) in SubSystemopzione o si può semplicemente digitare Console nel campo di testo!

Ora provalo ... dovrebbe funzionare


Questo ha funzionato per il mio VS2013 Express, ma la risposta accettata no. Molto strano, poiché la risposta accettata ha funzionato per tutte le versioni di Visual Studio che ho usato in passato.
Michael Calvin,

9
@MichaelCalvin Devi correre con Ctrl + F5 dopo aver impostato questo, questo è il kicker.
Jonathan Mee,

come ha dichiarato @JonathanMee, hai ancora eseguito Ctrl + F5. Questo era già stato impostato nel mio studio visivo 2015, quindi la prima risposta è stata quella che mi ha aiutato di più.

Questo è davvero corretto. Il familiare CTRL+F5fallirà se, per esempio, aggiungi un nuovo file C ++ a un progetto vuoto.
user2023370

Ha funzionato per me su Visual Studio Express 2015. Grazie.
LHC

44

Ecco un modo per C / C ++:

#include <stdlib.h>

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

Metti questo nella parte superiore del tuo programma e SE è su un sistema Windows ( #ifdef _WIN32), quindi creerà una macro chiamata WINPAUSE. Ogni volta che vuoi mettere in pausa il tuo programma, chiama WINPAUSE;e metterà in pausa il programma, usando il comando DOS. Per altri sistemi come Unix / Linux, la console non dovrebbe comunque chiudersi all'uscita dal programma.


Questo metodo non funziona in Visual C ++ (a meno che tu non includa qualche intestazione?)
wmac il

2
@wmac Devi includere l'intestazione windows.h
Geowil,

1
Non ho incluso alcuna libreria o spazio dei nomi ma funziona correttamente, grazie mille.
Halil İbrahim Oymacı

1
Non farlo, per favore. Il pausecomando è specifico di Windows.
firegurafiku,

Ha funzionato per me su Visual Studio 2013 Express. :)
Anirban il

32

Vai al menu Debug- > Premi Start senza debug


Questa non è nemmeno un'opzione in VS 2008 a meno che non sia stato scelto C # Development Environment. CTRL + F5 funziona però. Puoi anche aggiungere questo come pulsante alla barra degli strumenti tramite Strumenti> Personalizza.
Perry

Se si dispone di più progetti, impostare quello pertinente come progetto di avvio
Bloke CAD

27

Se stai usando .NET, metti Console.ReadLine() prima della fine del programma.

Aspetterà <ENTER>.


9
+1 - O quello o Console.ReadKey()semplicemente aspettare qualsiasi tasto.
Fredrik Mörk,

Strano, questo non ha alcun effetto nella mia app. Si chiude ancora senza attendere l'input dell'utente.
Kokodoko,

4
Quindi è molto probabile che il tuo codice esca prima che raggiunga quel punto.
Effettivamente il

20

A partire da Visual Studio 2017 (15.9.4) esiste un'opzione:

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

Il frammento corrispondente dalla documentazione di Visual Studio :

Chiudi automaticamente la console quando il debug si interrompe:

Indica a Visual Studio di chiudere la console al termine di una sessione di debug.


2
Ho appena provato questo in VS2017 e VS2019. Richiede sia l'impostazione del sottosistema su CONSOLE sia la disattivazione di questa opzione. L'uno o l'altro o nessuno dei due chiude automaticamente la finestra.
Casey,

Questo comunque mi chiude la finestra se lancio più progetti dalla stessa soluzione.
Serge Rogatch,

Sento che questa è la risposta giusta per VS 2017 e successivi. Peccato che non sia nelle versioni precedenti.
All the Rage

13

prova a chiamare getchar()subito prima dei main()ritorni.


Non funziona in VS 2008 per una semplice app console Hello Name. cout, cin, cout, getchar (), la console si chiude ancora. Qual è l'accordo?
Perry

1
Prova a mettere getchar () due volte se hai una cout poco prima di getchar (). getchar () si aspetta un char e lo stai già dando con cout ... Fammi sapere se questo aiuta :)
Magarusu

12

(/ SUBSYSTEM: CONSOLE) non ha funzionato per il mio vs2013 (l'avevo già fatto).

"Esegui senza debug" non è un'opzione, dal momento che non voglio passare dal debug alla visualizzazione dell'output.

Ho finito con

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

Soluzione utilizzata in qtcreator pre 2.6. Ora mentre qt sta crescendo, vs sta andando diversamente. Come ricordo, in vs2008 non avevamo bisogno di tali trucchi.


7

Ecco una soluzione che (1) non richiede alcuna modifica del codice o punti di interruzione e (2) fa una pausa dopo la fine del programma in modo da poter vedere tutto ciò che è stato stampato. Si fermerà dopo F5 o Ctrl + F5. Il principale svantaggio è che su VS2013 Express (come testato), non carica simboli, quindi il debug è molto limitato.

  1. Crea un file batch. Ho chiamato il mio runthenpause.bat, con i seguenti contenuti:

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

    La prima riga eseguirà qualunque comando tu fornisca e fino a otto argomenti. La seconda riga ... farà una pausa.

  2. Apri le proprietà del progetto | Proprietà di configurazione | Debug.

  3. Cambia "Argomenti comando" in $(TargetPath) (o qualunque cosa sia in "Comando").
  4. Cambia "Comando" nel percorso completo di runthenpause.bat .
  5. Premi OK.

Ora, quando corri, runthenpause.bat avvierà l'applicazione e, una volta terminata l'applicazione, ti metterà in pausa per vedere l'output della console.

Pubblicherò un aggiornamento se scoprirò come caricare i simboli. Ho provato /Z7per questo ma senza successo.


1
Questo non supporta ancora il debug, ma almeno affronta il problema di non poter vedere l'output, ad esempio di VLD, in contrasto con tutte le altre risposte.
Martin Hennings,

6

basta inserire come ultima riga di codice:

system("pause");

3

È possibile eseguire il file eseguibile da un prompt dei comandi. In questo modo è possibile vedere tutto l'output. Oppure potresti fare qualcosa del genere:

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

return YOUR_MAIN_CODE;

e in questo modo la finestra non si chiuderebbe fino a quando non si immettono i dati per la avariabile.


3

aggiungi “| pausa "nella casella degli argomenti dei comandi nella sezione debug nelle proprietà del progetto.


4
Sarebbe un'ottima soluzione se funzionasse. pausesembra funzionare solo in file batch e mentre riceve input dal programma su STDIN, non ristampa quel testo. Ho provato a sostituirlo |con &&, ma non ha avuto alcun effetto, presumibilmente perché non viene eseguito con una shell dei comandi (cmd.exe).
Brian Vandenberg,

3

Premi CNTRL + F5 per aprirlo in una finestra della riga di comando esterna (Visual Studio non ha il controllo su di esso).

Se il problema persiste, aggiungi quanto segue alla fine del codice:

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

Questo ti aspetta per premere un tasto per chiudere la finestra del terminale una volta che il codice ha raggiunto la fine.

Se vuoi farlo in più punti, inserisci il codice sopra in un metodo (es. private void Pause()) E chiama Pause()ogni volta che un programma raggiunge una possibile fine.


quando faccio il cntrl + f5 si apre e poi si chiude immediatamente? come lo risolvi?
Callat,

La seconda soluzione era quello che stavo cercando!
RoG

Quando premo Ctrl + F5, non succede nulla. Funzionava per me ma all'improvviso ha smesso di funzionare.
Natasha,

2

Una soluzione leggermente migliore:

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

all'inizio del programma.

Professionisti:

  • può usare std :: exit ()
  • può avere più ritorni dalla principale
  • puoi eseguire il tuo programma con il debugger
  • IDE indipendente (+ OS indipendente se si utilizza il cin.sync(); cin.ignore();trucco anziché system("pause");)

Contro:

  • modificare il codice
  • non si fermerà su std :: terminate ()
  • accadrà comunque nel tuo programma al di fuori della sessione IDE / debugger; puoi impedirlo in Windows usando:

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

Pessimo consiglio.
Saluti e hth. - Alf

Puoi spiegare perché?
GhassanPL,

Nel caso in cui uno non stia eseguendo il debug non fa nulla di utile, perché in questo caso non vi è alcun problema da risolvere. In VS basta eseguire il programma con Ctrl + F5 e basta, quindi non c'è nessun problema in VS, e in un interprete di comandi non c'è problema, in breve, non c'è problema. E nel caso in cui si stia eseguendo il debug e si desideri arrestare il codice aggiunto, non è una soluzione più conveniente di un punto di interruzione e interferisce nelle situazioni in cui non si desidera fermarsi.
Saluti e hth. - Alf

2

Utilizzare entrambi:

  1. cin.get();

o

  1. system("pause");

Assicurati di crearne uno alla fine della main()funzione e prima returndell'istruzione.


2

Puoi anche usare questa opzione

#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

Nel mio caso, l'ho sperimentato quando ho creato un progetto C ++ vuoto sull'edizione della community VS 2017. Sarà necessario impostare il sottosistema su "Console (/ SUBSYSTEM: CONSOLE)" in Proprietà di configurazione.

  1. Vai su "Visualizza" quindi seleziona "Gestore proprietà"
  2. Fare clic con il tasto destro sul progetto / soluzione e selezionare "Proprietà". Questo apre una pagina delle proprietà del Test
  3. Passa al linker quindi seleziona "Sistema"
  4. Fare clic su "Sottosistema" per visualizzare un menu a discesa
  5. Scegli "Console (/ SUBSYSTEM: CONSOLE)"
  6. Applicare e salvare
  7. La prossima volta che esegui il codice con "CTRL + F5", dovresti vedere l'output.

0

Visual Studio 2015 , con importazioni . Perché odio quando gli esempi di codice non danno le importazioni necessarie.

#include <iostream>;

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.