In letzter Zeit habe ich versucht, C++ zu lernen Diese Internetseite. Leider sehe ich jedes Mal, wenn ich versuche, eines der Codebeispiele auszuführen, dass das Programm etwa eine halbe Sekunde lang geöffnet und dann sofort geschlossen wird. Gibt es eine Möglichkeit, das sofortige Schließen des Programms zu verhindern, damit ich die Früchte meiner Bemühungen sehen kann?
Wie kann ich verhindern, dass die C++-Konsolenanwendung sofort beendet wird?
Adam P
James McNellis
Bearbeiten: Wie Charles Bailey in einem Kommentar unten zu Recht anmerkt, funktioniert dies nicht, wenn Zeichen zwischengespeichert sind stdin
, und es gibt wirklich keine gute Möglichkeit, das zu umgehen. Wenn Sie mit einem angeschlossenen Debugger arbeiten, ist die von John Dibling vorgeschlagene Lösung wahrscheinlich die sauberste Lösung für Ihr Problem.
Das heißt, ich werde dies hier lassen und vielleicht findet es jemand anderes nützlich. Ich habe es oft als eine Art schnellen Hack beim Schreiben von Tests während der Entwicklung verwendet.
Am Ende Ihrer main
Funktion können Sie aufrufen std::getchar();
Dies wird ein einzelnes Zeichen von erhalten stdin
wodurch Sie das Verhalten “drücken Sie eine beliebige Taste, um fortzufahren” erhalten (wenn Sie tatsächlich eine Meldung “drücken Sie eine beliebige Taste” möchten, müssen Sie selbst eine drucken).
Du musst #include <cstdio>
zum getchar
.
-
getchar
löst das Problem nicht – oder zumindest nur bedingt. Es liest ein Zeichen ausstdin
aber wenn bereits Zeichen von stdin gepuffert sind, wird das Programm ohne Wartezeit fortgesetzt, unabhängig davon, ob Sie eine Eingabeaufforderung drucken oder nicht.– CB Bailey
27. März 2010 um 14:46 Uhr
-
@Charles: Ein guter Punkt. Ignorieren bis
\n
ist eine Teillösung, hilft aber nicht, wenn mehr als eine Eingabezeile gepuffert wird. Ich kenne keinen Standard-C++-Weg, um alles aus einem Eingabestrom zu löschen. :-/– James McNellis
27. März 2010 um 15:44 Uhr
-
@James: Alt, aber wie wäre es
std::cin.ignore(std::cin.rdbuf()->in_avail());
? Habe es von hier.– GManNickG
3. Oktober 2010 um 10:35 Uhr
-
Eine Option, die ich häufig verwende, ist
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
mit#include <limits>
.– Xeo
29. Januar 2011 um 7:42 Uhr
-
Bitte tun Sie dies nicht. 🙁 Es ist nicht Teil der Funktion Ihres Programms, dies zu tun.
– Leichtigkeitsrennen im Orbit
23. Dezember 2011 um 11:42 Uhr
-
Das klingt nach einer Rube-Goldberg-Variante einer Lösung.
– Dave Van den Eynde
27. März 2010 um 14:36 Uhr
-
@Dave Van den Eynde: Es ist auch ziemlich üblich und kommt standardmäßig im Boilerplate-Code in DevCPP. +1
– Billy ONeal
27. März 2010 um 14:37 Uhr
-
@Dave auf der anderen Seite macht es deutlich, dass dies nur ein Ausweichmanöver für ein Beispiel ist, während std:getch versehentlich im echten Code belassen werden könnte.
– Martin Beckett
27. März 2010 um 17:10 Uhr
-
Dies ist eine vollkommen gültige Lösung für diejenigen unter Windows. Obwohl es nicht ideal ist, funktioniert es
– der Koschmann
10. Oktober 2012 um 13:12 Uhr
-
Einfachste, schnellste Lösung. Genau das, was ich brauchte
– CodyBugstein
18. Dezember 2013 um 12:53 Uhr
Herr Unterberg
Wenn Sie Visual C++ 2010 Express von Microsoft verwenden und auf das Problem mit STRG+F5 funktioniert nicht, um die Konsole nach Beendigung des Programms geöffnet zu halten, werfen Sie einen Blick auf diesen MSDN-Thread.
Wahrscheinlich ist Ihre IDE so eingestellt, dass sie die Konsole nach einem STRG+F5-Lauf schließt; Tatsächlich schließt ein „leeres Projekt“ in Visual C++ 2010 die Konsole standardmäßig. Um dies zu ändern, tun Sie, was der Microsoft Moderator vorgeschlagen hat:
Bitte klicken Sie mit der rechten Maustaste auf Ihren Projektnamen und gehen Sie zur Seite Eigenschaften, erweitern Sie bitte Konfigurationseigenschaften -> Linker -> System, wählen Sie bitte Konsole (/SUBSYSTEM:CONSOLE) in der Subsystem-Dropdown-Liste aus. Weil das leere Projekt es standardmäßig nicht angibt.
-
Was, wenn es keine Konsolen-App ist?
– Jesse Pfeffer
14. März 2012 um 6:29 Uhr
-
@Mr.Underhill Das wird nur funktionieren, wenn Sie ohne den Debugger starten (Strg+F5).
– Jonathan Mei
18. Dezember 2014 um 13:56 Uhr
-
Abgesehen davon, dass dies die einzige Nicht-Hack-Lösung ist, ist dies auch die einzige Möglichkeit, Drucke von Destruktoren von Hauptstapelobjekten zu sehen.
– Poniros
13. April 2019 um 11:52 Uhr
John Dibling
Normalerweise setze ich einfach einen Haltepunkt main()
‘s schließende geschweifte Klammer. Wenn das Ende des Programms auf welche Weise auch immer erreicht ist, wird der Haltepunkt erreicht und Sie können mit ALT-Tab zum Konsolenfenster wechseln, um die Ausgabe anzuzeigen.
-
Was, wenn es keine Konsolen-App ist?
– Jesse Pfeffer
14. März 2012 um 6:29 Uhr
-
@Mr.Underhill Das wird nur funktionieren, wenn Sie ohne den Debugger starten (Strg+F5).
– Jonathan Mei
18. Dezember 2014 um 13:56 Uhr
-
Abgesehen davon, dass dies die einzige Nicht-Hack-Lösung ist, ist dies auch die einzige Möglichkeit, Drucke von Destruktoren von Hauptstapelobjekten zu sehen.
– Poniros
13. April 2019 um 11:52 Uhr
Warum führen Sie das Programm nicht einfach von einer Konsole aus, dh führen Sie das Programm von cmd.exe aus, wenn Sie Windows verwenden. Auf diese Weise bleibt das Fenster nach Beendigung des Programms geöffnet.
[EDIT]: Wenn ich KDevelop4 verwende, läuft eine vollwertige Instanz von Bash (eine Linux-CLI) auf einer Registerkarte unten in der IDE. Welches verwende ich in solchen Situationen.
-
Denn wenn Sie eine IDE verwenden, verwenden Sie im Allgemeinen keine Konsole. Sie drücken Go, das Programm läuft, und das war’s.
– Billy ONeal
27. März 2010 um 14:40 Uhr
-
Jede kompetente IDE behält die Konsole auf dem Bildschirm, wenn die App beendet wird – Code::Blocks zum Beispiel macht genau das.
– anon
27. März 2010 um 14:49 Uhr
-
@nobugz: Ich habe es herausgefunden. Damit das Fenster bleibt, müssen Sie /SUBSYSTEM:CONSOLE in der Linker-Befehlszeile haben. Die Dokumentation sagt, dass dies die Standardeinstellung ist, wenn
main
ist definiert, aber wenn ich es nicht explizit in der Befehlszeile setze, beendet VS das Fenster, wenn die Anwendung beendet wird. Seufzen– James McNellis
27. März 2010 um 17:23 Uhr
-
@James: Das ist erforderlich, um überhaupt ein Konsolenfenster zu erhalten. Das wiederum erfordert main() statt WinMain(), nicht umgekehrt. Ich bin ein bisschen verloren…
– Hans Passant
27. März 2010 um 17:32 Uhr
-
@nobugz: Wenn Sie von einem “leeren Projekt” anstelle einer “Win32-Konsolenanwendung” starten, wird das Subsystem nicht explizit in den Projekteigenschaften festgelegt. Wenn Sie definieren
main
im Projekt verwendet der Linker standardmäßig das CONSOLE-Subsystem. Beim Debuggen oder Ausführen erhalten Sie ein Konsolenfenster. Sofern Sie CONSOLE jedoch nicht ausdrücklich als Subsystem in den Projekteigenschaften angeben, lässt Visual Studio das Konsolenfenster nicht geöffnet. Ich beginne immer mit einem leeren Projekt und ändere selten einzelne Projekteigenschaften, daher habe ich noch nie gesehen, dass das Konsolenfenster hängen bleibt. Sorry für die Verwirrung– James McNellis
27. März 2010 um 17:55 Uhr
Machst du einen Doppelklick auf die ausführbare Datei? Arbeiten Sie unter Windows? Warum arbeiten Sie nicht von der Befehlsshell aus und geben die Befehle so ein, wie Sie sie ausführen möchten?
– S. Lott
27. März 2010 um 14:34 Uhr
@S Lott: Denn wenn Sie in Ihrer IDE auf die Schaltfläche “Go” klicken, müssen Sie sich nicht um eine Konsole kümmern.
– Billy ONeal
27. März 2010 um 14:38 Uhr
Sie sollten erwägen, sich ein gutes Buch zu besorgen, aus dem Sie C++ lernen können. Websites sind gute Ressourcen, aber einem guten Einführungstext nicht gewachsen. Hier finden Sie eine endgültige Liste von C++-Büchern: stackoverflow.com/questions/388242/…
– James McNellis
27. März 2010 um 14:39 Uhr
@Billy Wenn das Drücken der Go-Taste die App beim Beenden schließt, verwenden Sie die falsche IDE.
– anon
27. März 2010 um 14:48 Uhr
Vorher hier gefragt und beantwortet: stackoverflow.com/questions/902261/… , obwohl dieser einen besseren Titel hat.
– dmckee — Ex-Moderator-Kätzchen
27. März 2010 um 15:33 Uhr