Wie kann ich verhindern, dass die C++-Konsolenanwendung sofort beendet wird?

Lesezeit: 6 Minuten

Wie kann ich verhindern dass die C Konsolenanwendung sofort beendet wird
Adam P

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?

  • 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

Wie kann ich verhindern dass die C Konsolenanwendung sofort beendet wird
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 stdinwodurch 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 aus stdinaber 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

1647208209 536 Wie kann ich verhindern dass die C Konsolenanwendung sofort beendet wird
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

1647208210 867 Wie kann ich verhindern dass die C Konsolenanwendung sofort beendet wird
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

999110cookie-checkWie kann ich verhindern, dass die C++-Konsolenanwendung sofort beendet wird?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy