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?

Martin
quelle
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.

Tom
quelle
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

Viraj
quelle
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.

Shaun
quelle
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

pashaplus
quelle
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>.

Cheeso
quelle
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.

Chronoxor
quelle
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 .

Magarusu
quelle
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.

fantastisch
quelle
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.

cxw
quelle
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");
RefaelJan
quelle
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 .

Geo
quelle
3

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

theambient
quelle
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.

Vorsicht1
quelle
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"); });
    ...
}
GhassanPL
quelle
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.

AAEM
quelle
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;
}
Vladimir Salguero
quelle
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.
Stephen Haruna
quelle
0

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

#include <iostream>;

int main()
{
    getchar();
    return 0;
}
JMI MADISON
quelle