Verhindern, dass das Konsolenfenster in der Visual Studio C / C ++ - Konsolenanwendung geschlossen wird


464

Dies ist wahrscheinlich eine peinliche Frage, da die Antwort zweifellos offensichtlich ist.

Ich habe Visual Studio jahrelang verwendet, aber dies ist das erste Mal, dass ich eine Konsolenanwendung entwickelt habe.

Wenn ich meine Anwendung ausführe, wird das Konsolenfenster geöffnet, die Programmausgabe wird angezeigt und das Fenster wird beim Beenden der Anwendung geschlossen.

Gibt es eine Möglichkeit, es entweder offen zu halten, bis ich die Ausgabe überprüft habe, oder die Ergebnisse anzuzeigen, nachdem das Fenster geschlossen wurde?


Monodevelop macht das, was Sie erwarten.
Strg-Alt-Delor

3
Es gibt zu viele Antworten unten, also kopiere ich hier eine Antwort: Wenn Sie VS2017 verwenden, dann Extras-> Optionen-> Debuggen-> Konsole automatisch schließen
jw_

Einverstanden. Ich denke, die beste Antwort für VS 2017 und neuer ist die von chronoxor.
All die Wut

Antworten:


466

Wenn Sie ohne Debugging ausführen (Strg + F5), werden Sie standardmäßig aufgefordert, die Eingabetaste zu drücken, um das Fenster zu schließen. Wenn Sie den Debugger verwenden möchten, sollten Sie in der letzten Zeile einen Haltepunkt setzen.


268
Wenn Sie eine C ++ - App haben und ohne Debugging ausführen und das Konsolenfenster weiterhin geschlossen wird, müssen Sie daran denken, das Subsystem unter Konfigurationseigenschaften / Linker / System explizit auf Konsole festzulegen. Dies kann passieren, wenn Sie mit einem leeren Projekt beginnen, wodurch das Subsystem nicht festgelegt wird.
Trevor Robinson

4
Hat bei mir nicht funktioniert :( Das Konsolenfenster wird sofort geöffnet und geschlossen, aber das Protokoll wird angehalten und wartet auf einen zusätzlichen Druck von F5
CodyBugstein

40
Die richtige Antwort ist die von @TrevorRobinson: Hier ist die erweiterte Version, wenn Sie Probleme haben, herauszufinden, wo sich die Konfigurationseigenschaften befinden: Klicken Sie mit der rechten Maustaste auf Ihr Projekt in Visual Studio> Eigenschaften> Konfigurationseigenschaften> Linker> System, ändern Sie das Subsystem in " Konsole "
PlagueHammer

3
Trevor Robinson hat recht. Wenn Sie ein leeres Projekt und ein C ++ - Element starten. Sie müssen zu Ansicht-> Eigenschaften-Manager-> Eigenschaft (Schraubenschlüsselsymbol) -> Konfiguration gehen. Eigenschaften-> Linker-> System-> Subsystem-> Wählen Sie im Popup-Menü Konsole.
Ehrwürdigster Herr

10
Ich arbeite an der VS-Community 2017. ctrl+f5funktioniert nicht, es gibt kein, Propertieswenn ich mit der rechten Maustaste auf das Projekt wrench iconklicke , auch das ist ausgegraut.
Ketan

232

Klicken Sie mit der rechten Maustaste auf Ihr Projekt

Eigenschaften> Konfigurationseigenschaften> Linker> System

Wählen Sie Konsole (/ SUBSYSTEM: CONSOLE) in der SubSystemOption oder geben Sie einfach Konsole in das Textfeld ein!

Jetzt probieren Sie es aus ... es sollte funktionieren


Dies funktionierte für meinen VS2013 Express, die akzeptierte Antwort jedoch nicht. Sehr seltsam, da die akzeptierte Antwort für alle Visual Studio-Versionen funktioniert hat, die ich in der Vergangenheit verwendet habe.
Michael Calvin

9
@MichaelCalvin Du musst mit Strg + F5 laufen, nachdem du dies eingestellt hast, das ist der Kicker.
Jonathan Mee

Wie @JonathanMee sagte, haben Sie immer noch Strg + F5 ausgeführt. Dies wurde bereits in meinem Visual Studio 2015 eingestellt, daher war die erste Antwort die, die am meisten half.

Das ist in der Tat richtig. Das Vertraute CTRL+F5schlägt fehl, wenn Sie beispielsweise einem leeren Projekt eine neue C ++ - Datei hinzufügen.
user2023370

Arbeitete für mich in Visual Studio Express 2015. Danke.
LHC

44

Hier ist ein Weg für C / C ++:

#include <stdlib.h>

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

Fügen Sie dies oben in Ihr Programm ein. Wenn es sich auf einem Windows-System befindet ( #ifdef _WIN32), wird ein Makro mit dem Namen erstellt WINPAUSE. Wenn Sie möchten, dass Ihr Programm angehalten wird, rufen Sie es auf WINPAUSE;und das Programm wird mit dem DOS-Befehl angehalten. Bei anderen Systemen wie Unix / Linux sollte die Konsole beim Beenden des Programms ohnehin nicht beendet werden.


Diese Methode funktioniert nicht in Visual C ++ (es sei denn, Sie
fügen

2
@wmac Sie müssen den windows.h Header
einschließen

1
Ich habe keine Bibliothek oder keinen Namespace eingefügt, aber es läuft korrekt, vielen Dank.
Halil İbrahim Oymacı

1
Tu das bitte nicht. Der pauseBefehl ist Windows-spezifisch.
Firegurafiku

Arbeitete für mich in Visual Studio 2013 Express. :)
Anirban

32

Gehe zu Debug-Menü -> Drücke StartWithoutDebugging


Dies ist in VS 2008 nicht einmal eine Option, es sei denn, C # Development Environment wurde ausgewählt. STRG + F5 funktioniert jedoch. Sie können dies auch als Schaltfläche zur Symbolleiste über Extras> Anpassen hinzufügen.
Perry

Wenn Sie mehrere Projekte haben, legen Sie das entsprechende als Startprojekt fest
CAD-Typ

27

Wenn Sie .NET verwenden, setzen Sie es Console.ReadLine()vor das Ende des Programms.

Es wird warten <ENTER>.


9
+1 - Entweder das oder Console.ReadKey()einfach auf einen Schlüssel warten.
Fredrik Mörk

Seltsam, das hat in meiner App keine Auswirkung. Es wird weiterhin geschlossen, ohne auf Benutzereingaben zu warten.
Kokodoko

4
Dann wird Ihr Code höchstwahrscheinlich beendet, bevor er diesen Punkt erreicht.
In der Tat

20

Ab Visual Studio 2017 (15.9.4) gibt es eine Option:

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

Das entsprechende Fragment aus der Visual Studio-Dokumentation :

Schließen Sie die Konsole automatisch, wenn das Debuggen beendet wird:

Weist Visual Studio an, die Konsole am Ende einer Debugging-Sitzung zu schließen.


2
Ich habe dies gerade in VS2017 und VS2019 getestet. Dazu muss sowohl das Subsystem auf KONSOLE gesetzt als auch diese Option deaktiviert werden. Wenn Sie das eine oder das andere oder keines haben, wird das Fenster automatisch geschlossen.
Casey

Dadurch wird das Fenster für mich immer noch geschlossen, wenn ich mehrere Projekte mit derselben Lösung starte.
Serge Rogatch

Ich denke, dies ist die richtige Antwort für VS 2017 und danach. Schade, dass es nicht in älteren Versionen ist.
All die Wut

13

Versuchen Sie, getchar()direkt vor der main()Rückkehr anzurufen .


Funktioniert in VS 2008 nicht für eine einfache Hello Name-Konsolen-App. cout, cin, cout, getchar (), Konsole schließt immer noch. Was ist das Problem?
Perry

1
Versuchen Sie, getchar () zweimal zu setzen, wenn Sie kurz vor getchar () einen Cout haben. getchar () erwartet einen char und du gibst ihn bereits mit cout ... Lass es mich wissen, wenn das hilft :)
Magarusu

12

(/ SUBSYSTEM: CONSOLE) hat bei meinem vs2013 nicht funktioniert (ich hatte es bereits).

"Ausführen ohne Debuggen" ist keine Option, da ich nicht zwischen Debuggen und Anzeigen der Ausgabe wechseln möchte.

Ich endete mit

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

In qtcreator vor 2.6 verwendete Lösung. Jetzt, während qt wächst, geht vs in eine andere Richtung. Wie ich mich erinnere, brauchten wir im Jahr 2008 solche Tricks nicht.


7

Hier ist eine Lösung, bei der (1) keine Codeänderungen oder Haltepunkte erforderlich sind und (2) nach Beendigung des Programms angehalten wird, damit Sie alles sehen können , was gedruckt wurde. Es wird entweder nach F5 oder Strg + F5 angehalten. Der Hauptnachteil ist, dass in VS2013 Express (wie getestet) keine Symbole geladen werden, sodass das Debuggen sehr eingeschränkt ist.

  1. Erstellen Sie eine Batchdatei. Ich habe meine angerufen runthenpause.bat, mit folgendem Inhalt:

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

    In der ersten Zeile wird der von Ihnen angegebene Befehl und bis zu acht Argumente ausgeführt. Die zweite Zeile wird ... angehalten.

  2. Öffnen Sie die Projekteigenschaften | Konfigurationseigenschaften | Debuggen.

  3. Ändern Sie "Befehlsargumente" in $(TargetPath)(oder was auch immer in "Befehl" steht).
  4. Ändern Sie "Befehl" in den vollständigen Pfad zu runthenpause.bat.
  5. Klicken Sie auf OK.

Wenn Sie jetzt ausführen, runthenpause.batwird Ihre Anwendung gestartet und nach Beendigung Ihrer Anwendung angehalten, damit Sie die Konsolenausgabe sehen können.

Ich werde ein Update veröffentlichen, wenn ich herausfinde, wie die Symbole geladen werden. Ich habe versucht , /Z7pro dies aber ohne Erfolg.


1
Dies unterstützt das Debuggen immer noch nicht, behebt jedoch zumindest das Problem, dass die Ausgabe, z. B. von VLD, im Gegensatz zu allen anderen Antworten nicht angezeigt werden kann.
Martin Hennings

6

Geben Sie einfach als letzte Codezeile ein:

system("pause");

3

Sie können Ihre ausführbare Datei an einer Eingabeaufforderung ausführen. Auf diese Weise konnten Sie die gesamte Ausgabe sehen. Oder Sie könnten so etwas tun:

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

return YOUR_MAIN_CODE;

Auf diese Weise wird das Fenster erst geschlossen, wenn Sie Daten für die aVariable eingeben .


3

füge hinzu “| pause ”im Feld für Befehlsargumente im Abschnitt zum Debuggen in den Projekteigenschaften.


4
Dies wäre eine großartige Lösung, wenn es funktionieren würde. pausescheint nur in Batch-Dateien zu funktionieren, und während es Eingaben von Ihrem Programm auf STDIN empfängt, wird dieser Text nicht erneut gedruckt. Ich habe versucht , Ersatz |mit &&, aber es hatte keine Wirkung - vermutlich , weil es nicht mit einem Kommando - Shell (cmd.exe) ausgeführt wird .
Brian Vandenberg

3

Drücken Sie einfach CNTRL + F5, um es in einem externen Befehlszeilenfenster zu öffnen (Visual Studio hat keine Kontrolle darüber).

Wenn dies nicht funktioniert, fügen Sie am Ende Ihres Codes Folgendes hinzu:

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

Warten Sie, bis Sie eine Taste drücken, um das Terminalfenster zu schließen, sobald der Code das Ende erreicht hat.

Wenn Sie dies an mehreren Stellen tun möchten, fügen Sie den obigen Code in eine Methode ein (z. B. private void Pause()) und rufen Sie auf, Pause()wann immer ein Programm ein mögliches Ende erreicht.


wenn ich cntrl + f5 mache, öffnet es sich und schließt sich sofort? Wie behebt man das?
Callat

Die zweite Lösung war das, wonach ich gesucht habe!
RoG

Wenn ich Strg + F5 drücke, passiert nichts. Früher hat es bei mir funktioniert, aber plötzlich hat es aufgehört zu funktionieren.
Natasha

2

Eine etwas bessere Lösung:

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

zu Beginn Ihres Programms.

Vorteile:

  • kann std :: exit () verwenden
  • kann mehrere Rückgaben von main haben
  • Sie können Ihr Programm unter dem Debugger ausführen
  • IDE-unabhängig (+ OS-unabhängig, wenn Sie den cin.sync(); cin.ignore();Trick anstelle von verwenden system("pause");)

Nachteile:

  • Code ändern müssen
  • pausiert nicht bei std :: terminate ()
  • wird weiterhin in Ihrem Programm außerhalb der IDE / Debugger-Sitzung auftreten; Sie können dies unter Windows verhindern, indem Sie:

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

Sehr schlechter Rat.
Prost und hth. - Alf

Können Sie näher erläutern, warum?
GhassanPL

In dem Fall, in dem man nicht debuggt, ist es nicht nützlich, da in diesem Fall kein Problem zu lösen ist. In VS führen Sie das Programm einfach mit Strg + F5 aus und das war's, also gibt es kein Problem in VS, und in einem Befehlsinterpreter gibt es kein Problem, kurz gesagt, es gibt kein Problem. Und in dem Fall, in dem man debuggt und möchte, dass ein Stopp hinzugefügt wird, ist der hinzugefügte Code keine bequemere Lösung als ein Haltepunkt und greift in Situationen ein, in denen man keinen Stopp möchte.
Prost und hth. - Alf

2

Verwenden Sie entweder:

  1. cin.get();

oder

  1. system("pause");

Stellen Sie sicher, dass Sie eine davon am Ende der main()Funktion und vor der returnAnweisung erstellen.


2

Sie können diese Option auch verwenden

#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

In meinem Fall habe ich dies erlebt, als ich ein leeres C ++ - Projekt für die VS 2017 Community Edition erstellt habe. Sie müssen das Subsystem unter Konfigurationseigenschaften auf "Konsole (/ SUBSYSTEM: CONSOLE)" einstellen.

  1. Gehen Sie zu "Ansicht" und wählen Sie "Property Manager".
  2. Klicken Sie mit der rechten Maustaste auf das Projekt / die Lösung und wählen Sie "Eigenschaft". Dies öffnet eine Testeigenschaftsseite
  3. Navigieren Sie zum Linker und wählen Sie "System".
  4. Klicken Sie auf "SubSystem" und ein Dropdown-Menü wird angezeigt
  5. Wählen Sie "Konsole (/ SUBSYSTEM: CONSOLE)"
  6. Übernehmen und speichern
  7. Wenn Sie Ihren Code das nächste Mal mit "STRG + F5" ausführen, sollte die Ausgabe angezeigt werden.

0

Visual Studio 2015 mit Importen . Weil ich es hasse, wenn Codebeispiele nicht die erforderlichen Importe liefern.

#include <iostream>;

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.