Wie kann verhindert werden, dass die C ++ - Konsolenanwendung sofort beendet wird?

193

In letzter Zeit habe ich versucht, C ++ von dieser Website zu lernen . Wenn ich versuche, eines der Codebeispiele auszuführen, wird das Programm leider etwa eine halbe Sekunde lang geöffnet und dann sofort geschlossen. Gibt es eine Möglichkeit, das sofortige Schließen des Programms zu verhindern, damit ich die Früchte meiner Bemühungen sehen kann?

Adam P.
quelle
5
Doppelklicken Sie auf die ausführbare Datei? Arbeiten Sie in Windows? Warum arbeiten Sie nicht über die Befehlsshell und geben die Befehle so ein, wie Sie sie ausführen möchten?
S.Lott
8
@S Lott: Wenn Sie in Ihrer IDE auf die Schaltfläche "Los" klicken, müssen Sie sich nicht um eine Konsole kümmern.
Billy ONeal
4
Sie sollten überlegen, ein gutes Buch zu bekommen, aus dem Sie C ++ lernen können. Websites sind gute Ressourcen, passen aber nicht zu einem guten Einführungstext. Es gibt eine endgültige Liste von C ++ - Büchern hier: stackoverflow.com/questions/388242/…
James McNellis
6
@Billy Wenn Sie durch Drücken der Go-Taste die App beim Beenden schließen, verwenden Sie die falsche IDE.
2
Hier zuvor gefragt und beantwortet: stackoverflow.com/questions/902261/… , obwohl dieser einen besseren Titel hat.
dmckee --- Ex-Moderator Kätzchen

Antworten:

120

Bearbeiten: Wie Charles Bailey in einem Kommentar unten zu Recht hervorhebt, funktioniert dies nicht, wenn Zeichen gepuffert sind stdin, und es gibt wirklich keine gute Möglichkeit, dies 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 lasse das hier und vielleicht findet es jemand anderes nützlich. Ich habe es oft als eine Art schnellen Hack benutzt, wenn ich Tests während der Entwicklung geschrieben habe.


Am Ende Ihrer mainFunktion können Sie anrufenstd::getchar();

Dadurch wird ein einzelnes Zeichen erhalten stdin, wodurch Sie das Verhalten "Drücken Sie eine beliebige Taste, um fortzufahren" erhalten (wenn Sie tatsächlich die Meldung "Drücken Sie eine beliebige Taste" möchten, müssen Sie selbst eine drucken).

Sie müssen #include <cstdio>für getchar.

James McNellis
quelle
15
getcharlöst das Problem nicht - oder zumindest nur unter begrenzten Umständen. Es liest ein stdinZeichen von , aber wenn bereits Zeichen von stdin gepuffert sind, fährt das Programm fort, ohne zu warten, unabhängig davon, ob Sie eine Eingabeaufforderung drucken oder nicht.
CB Bailey
1
@ Charles: Ein guter Punkt. Das Ignorieren bis \nist eine Teillösung, hilft aber nicht, wenn mehr als eine Eingabezeile gepuffert ist. Ich kenne keine Standard-C ++ - Methode, um alles aus einem Eingabestream zu löschen. : - /
James McNellis
1
@ James: Alt, aber wie wäre es std::cin.ignore(std::cin.rdbuf()->in_avail());? Habe es von hier bekommen .
GManNickG
1
Eine Option, die ich oft benutze, ist std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');mit #include <limits>.
Xeo
5
Bitte tu das nicht. :( Es gehört nicht zur Funktion Ihres Programms, dies zu tun.
Leichtigkeitsrennen im Orbit
138

Wenn Sie Visual Studio verwenden und die Konsolenanwendung über die IDE starten:

Durch Drücken von STRG-F5 (ohne Debugging starten) wird die Anwendung gestartet und das Konsolenfenster geöffnet, bis Sie eine beliebige Taste drücken.

Nabulke
quelle
1
Konsole aus der IDE starten? Wie und warum würdest du das tun?
CodyBugstein
1
Ausgezeichnet, es hat funktioniert. Warum ist dies nicht das Standardverhalten von Visual Studio?
Leuchte
Ich dachte auch, dass dies der Weg war, bis heute, als ich ein einfaches Konsolenprogramm erstellte und die obige Methode nicht funktionierte :(
KansaiRobot
1
Gibt es eine Version davon mit Debugging?
happyging3r
109

Die Lösung von James funktioniert für alle Plattformen.

Alternativ Windowskönnen Sie kurz vor Ihrer Rückkehr von der mainFunktion Folgendes hinzufügen :

  system("pause");

Dadurch wird der pauseBefehl ausgeführt, der wartet, bis Sie eine Taste drücken, und außerdem eine nette Nachricht anzeigtPress any key to continue . . .

Codaddict
quelle
2
Das klingt nach einer Rube Goldberg-Variante einer Lösung.
Dave Van den Eynde
4
@ Dave Van den Eynde: Es ist auch ziemlich häufig und gehört standardmäßig zum Boilerplate-Code in DevCPP. +1
Billy ONeal
4
@ Dave hingegen macht deutlich, dass dies nur ein Beispiel ist, während std: getch versehentlich in echtem Code belassen werden könnte.
Martin Beckett
2
Dies ist eine absolut gültige Lösung für Windows-Benutzer. Obwohl es nicht ideal ist, funktioniert es
Thecoshman
Einfachste, schnellste Lösung. Genau das, was ich brauchte
CodyBugstein
83

Wenn Sie Microsoft Visual C ++ 2010 Express verwenden und auf das Problem stoßen, dass STRG + F5 nicht funktioniert, um die Konsole nach Beendigung des Programms geöffnet zu halten, sehen Sie sich diesen MSDN-Thread an .

Wahrscheinlich ist Ihre IDE so eingestellt, dass die Konsole nach einem STRG + F5-Lauf geschlossen wird. Tatsächlich schließt ein "leeres Projekt" in Visual C ++ 2010 die Konsole standardmäßig. Um dies zu ändern, gehen Sie wie vom Microsoft-Moderator vorgeschlagen vor:

Klicken Sie mit der rechten Maustaste auf Ihren Projektnamen und gehen Sie zur Seite Eigenschaften. Erweitern Sie Konfigurationseigenschaften -> Linker -> System. Wählen Sie in der Dropdown-Liste Subsystem die Option Konsole (/ SUBSYSTEM: CONSOLE) aus. Da das leere Projekt dies standardmäßig nicht angibt.

Mr. Underhill
quelle
1
Was ist, wenn es keine Konsolen-App ist?
Jesse Pepper
3
@ Mr.Underhill Dies funktioniert nur , wenn Sie ohne den Debugger starten (Strg + F5).
Jonathan Mee
Dies ist nicht nur die einzige Nicht-Hack-Lösung, sondern auch die einzige Möglichkeit, Drucke von Destruktoren von Hauptstapelobjekten anzuzeigen.
Poniros
20

Normalerweise setze ich nur einen Haltepunkt main() die schließende geschweifte Klammer. Wenn das Ende des Programms auf irgendeine Weise erreicht ist, wird der Haltepunkt erreicht und Sie können ALT-Tab zum Konsolenfenster, um die Ausgabe anzuzeigen.

John Dibling
quelle
14

Warum nicht einfach das Programm von einer Konsole aus ausführen, dh das Programm von cmd.exe aus ausführen, wenn Sie Windows verwenden? Auf diese Weise bleibt das Fenster nach Beendigung des Programms geöffnet.

[BEARBEITEN]: Wenn ich KDevelop4 verwende, wird eine vollwertige Instanz von Bash (eine Linux-CLI) in einer Registerkarte am unteren Rand der IDE ausgeführt. Welches ist, was ich unter solchen Umständen benutze.

Amos
quelle
3
Denn wenn Sie eine IDE verwenden, verwenden Sie im Allgemeinen keine Konsole. Sie drücken go, das Programm läuft und das wars.
Billy ONeal
3
Jede kompetente IDE hält die Konsole auf dem Bildschirm, wenn die App beendet wird - Code :: Blocks zum Beispiel macht genau das.
3
@nobugz: Ich habe es herausgefunden. Damit das Fenster erhalten bleibt, muss / SUBSYSTEM: CONSOLE in der Linker-Befehlszeile angezeigt werden. In der Dokumentation heißt es, dass dies die Standardeinstellung mainist, wenn sie definiert ist. Wenn ich sie jedoch nicht explizit in der Befehlszeile festlege, beendet VS das Fenster, wenn die Anwendung beendet wird. Seufzer
James McNellis
2
@ James: Das ist erforderlich, um überhaupt ein Konsolenfenster zu erhalten. Dies erfordert wiederum main () anstelle von WinMain (), nicht umgekehrt. Ich bin ein bisschen verloren ...
Hans Passant
4
@nobugz: Wenn Sie von einem "leeren Projekt" anstelle einer "Win32-Konsolenanwendung" ausgehen, wird das Subsystem in den Projekteigenschaften nicht explizit festgelegt. Wenn Sie mainim Projekt definieren , verwendet der Linker standardmäßig das CONSOLE-Subsystem. Beim Debuggen oder Ausführen wird ein Konsolenfenster angezeigt. Sofern Sie in den Projekteigenschaften nicht explizit CONSOLE als Subsystem angeben, lässt Visual Studio das Konsolenfenster nicht geöffnet. Ich beginne immer mit einem leeren Projekt und ändere selten einzelne Projekteigenschaften, sodass ich nie gesehen habe, dass das Konsolenfenster hängen bleibt. Entschuldigung für die Verwirrung
James McNellis
9

Fügen Sie vor dem Ende Ihres Codes diese Zeile ein:

system("pause");

Dadurch bleibt die Konsole so lange erhalten, bis Sie eine Taste drücken.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause"); // <----------------------------------
    return 0; // This return statement isn't necessary
}
Robert
quelle
Außerdem wurde "Drücken Sie eine beliebige Taste, um fortzufahren ..." gedruckt. für mich.
PapaHotelPapa
8

cin.get();2 mal anrufen :

    //...
    cin.get();
    cin.get();
    return 0
}
tsx
quelle
6
aber warum zweimal?
Madhawa Priyashantha
Was ist, wenn wir ein anderes cin.get () benötigen, um beispielsweise zuvor einen String innerhalb des Arrays abzurufen? In diesem Szenario funktioniert es nicht.
QMaster
4

Wenn Sie Ihren Code von einer kompetenten IDE wie Code :: Blocks ausführen, verwaltet die IDE die Konsole, mit der der Code ausgeführt wird, und lässt sie beim Schließen der Anwendung geöffnet. Sie möchten keinen speziellen Code hinzufügen, um die Konsole offen zu halten, da dies die ordnungsgemäße Funktion der Konsole beeinträchtigt, wenn Sie sie außerhalb der IDE tatsächlich verwenden.


quelle
3

Okay, ich vermute, Sie arbeiten mit Visual Studio unter Windows ... warum? Nun, wenn Sie unter einem Linux-Betriebssystem arbeiten, werden Sie es wahrscheinlich von der Konsole aus ausführen.

Wie auch immer, Sie können am Ende Ihres Programms Mist hinzufügen, wie andere es vorschlagen, oder Sie können einfach STRG + F5 drücken (ohne Debugging starten) und Visual Studio lässt die Konsole .

Eine andere Option, wenn Sie die Debug-Version ausführen und Ihrem Code keinen Mist hinzufügen möchten, besteht darin, das Konsolenfenster (Start -> Ausführen -> cmd) zu öffnen und zu Ihrem Debug-Ausgabeverzeichnis zu navigieren . Geben Sie dann einfach den Namen Ihrer ausführbaren Datei ein und Ihr Debug-Programm wird in der Konsole ausgeführt. Sie können dann den Anhang von Visual Studio verwenden, um etwas zu verarbeiten, wenn Sie dies wirklich möchten.

Polaris878
quelle
3
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

    cout << "Press any key to continue...";
    getch();

    return 0;
}

Ich habe nicht bemerkt, dass jemand anderes dies gepostet hat, also hier ist es.

Ruan
quelle
Ich würde hinzufügen, dass dies conio.hein Windows-spezifischer Header ist und möglicherweise nicht auf jedem Computer verfügbar ist (oder Sie müssen ihn möglicherweise separat verknüpfen, was ein Overkill ist).
Yksisarvinen
Arbeiten. musste nur getch () ändern; zu _getch (); seit es veraltet ist
ncesar
2

Wenn Sie Ihre Anwendung tatsächlich in Visual C ++ debuggen, drücken Sie F5 oder das grüne Dreieck in der Symbolleiste. Wenn Sie es nicht wirklich debuggen (Sie haben keine Haltepunkte festgelegt), drücken Sie Strg + F5 oder wählen Sie Start ohne Debugging in den Menüs (es befindet sich normalerweise im Debug-Menü, was meiner Meinung nach verwirrend ist.) Es wird etwas schneller sein. und was für Sie noch wichtiger ist, wird am Ende pausieren, ohne dass Sie Ihren Code ändern müssen.

Alternativ können Sie eine Eingabeaufforderung öffnen, zu dem Ordner navigieren, in dem sich Ihre Exe befindet, und sie ausführen, indem Sie ihren Namen eingeben. Auf diese Weise wird die Eingabeaufforderung nach Abschluss der Ausführung nicht geschlossen und Sie können die Ausgabe sehen. Ich bevorzuge beide Methoden gegenüber dem Hinzufügen von Code, der die App stoppt, sobald sie fertig ist.

Kate Gregory
quelle
2

Fügen Sie einfach am Ende Ihres Programms Folgendes hinzu. Es wird versucht, eine Form von Benutzereingaben zu erfassen, sodass die Konsole nicht automatisch geschlossen wird.

cin.get();
Bat_Programmer
quelle
2

Fügen Sie vor jeder exit()Funktion oder vor jedem returns in die folgenden Zeilen ein main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
Thomas Matthews
quelle
Das funktioniert bei mir nicht, die erste Zeile funktioniert, aber die Eingabetaste bringt nichts
Qwertie
2

Für Visual Studio (und nur für Visual Studio) erhalten Sie mit dem folgenden Codeausschnitt die Eingabeaufforderung "Warten, bis der Tastendruck fortgesetzt wird", die wirklich darauf wartet, dass der Benutzer eine neue Taste explizit drückt , indem er zuerst den Eingabepuffer leert:

#include <cstdio>
#include <tchar.h>
#include <conio.h>

_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();

Beachten Sie, dass dies die tchar.hMakros verwendet, um mit mehreren 'Zeichensätzen' kompatibel zu sein (wie VC ++ sie nennt).

MicroVirus
quelle
2

Ich mache einfach das:

//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;

Hinweis: Das Löschen des CIN-Puffers und dergleichen ist nur erforderlich, wenn Sie CIN zu einem früheren Zeitpunkt in Ihrem Programm verwendet haben. Auch die Verwendung von std :: numeric_limits :: max () ist wahrscheinlich besser als INT_MAX, aber etwas wortreich und normalerweise unnötig.

GuestPerson00001
quelle
Es funktioniert, aber die Rückgabe 0; wird nicht ausgeführt, wenn ich diesen Code verwende.
wernersbacher
2

Verwenden Sie #include "stdafx.h"& system("pause");genau wie den Code unten.

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    std::cout << "hello programmer!\n\nEnter 2 numbers: ";
    int x, y;
    std::cin >> x >> y;
    int w = x*y;
    std::cout <<"\nyour answer is: "<< w << endl;
    system("pause");
}
Mohammed Nouh
quelle
systemwird in deklariert <cstdlib>, nicht stdafx.h.
Melpomene
1

Ähnliche Idee wie Ihre Antwort, nur minimalistische Alternative.

Erstellen Sie eine Batchdatei mit folgendem Inhalt:

helloworld.exe
pause

Verwenden Sie dann die Batch-Datei.

Cœur
quelle
1

einfach

#include <cstdio>

    int main(){
        // code...
        std::getchar();
        std::getchar();
        return 0;
    }

Aus irgendeinem Grund kann normalerweise 1 Zeichen mit getchar bereits in stdin gelesen werden, wenn Sie ein Programm ausführen. Der erste getchar liest dieses Zeichen und der zweite getchar wartet auf Benutzereingaben, bevor er das Programm beendet. Und nachdem ein Programm die meisten Terminals beendet hat, schließen Sie das Terminal sofort, insbesondere unter Windows. Wir wollen also auf einfache Weise verhindern, dass ein Programm beendet wird, nachdem es alles ausgegeben hat. Natürlich gibt es komplexere und sauberere Wege, um dies zu lösen, aber dies ist der einfachste.

Dmitriy Suserov
quelle
2
Bitte fügen Sie mindestens eine kurze Erklärung hinzu, warum dies das Problem löst.
Kaya3
0

Überprüfen Sie, ob Ihre IDE in der Projekteinstellung ein Kontrollkästchen enthält, um das Fenster nach dem Beenden des Programms geöffnet zu lassen. Wenn nicht, std::cin.get();lesen Sie ein Zeichen am Ende der Hauptfunktion. Verwenden Sie jedoch nur zeilenbasierte Eingaben (std :: getline) oder behandeln Sie ansonsten ungelesene Zeichen (std :: ignore bis newline), da sonst .get () am Ende nur den Müll liest, den Sie hinterlassen haben früher ungelesen.

Tronic
quelle
0

Das scheint gut zu funktionieren:

cin.clear();
cin.ignore(2);

Wenn Sie zuerst den Puffer löschen, ist dies kein Problem, wenn Sie den nächsten lesen. Aus irgendeinem Grund cin.ignore(1)funktioniert es nicht, es muss 2 sein.

Northcode
quelle
1
2 ist manchmal auch nicht genug (wenn mehr Tastenanschläge in der Warteschlange stehen). Der richtige Weg ist, so viele Zeichen wie in der Warteschlange zu ignorieren. Um mit , cin.rdbuf()->in_avail. Keine magische Zahl wie 1 oder 2.
Konrad Rudolph
0

Sie können jederzeit eine Batchdatei erstellen. Wenn Ihr Programm beispielsweise helloworld.exe heißt, lautet der folgende Code:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
yeh
quelle
0

Wenn Sie Windows ausführen, können Sie system("pause >nul");oder system("pause");. Es führt einen Konsolenbefehl aus, um das Programm anzuhalten, bis Sie eine Taste drücken. >nulverhindert es zu sagen Press any key to continue....

PatThaCoder
quelle
0

Ich setze einen Haltepunkt bei der letzten Rückgabe 0 des Programms. Es funktioniert gut.

Lierosk
quelle
1
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren .
Ravi Dhoriya ツ
1
Wie gibt dies keine Antwort? Ich bin in genau der gleichen Situation wie der Autor einer Frage und das hilft.
Lierosk
0

Ich habe verwendet cin.get()und das hat funktioniert, aber eines Tages musste ich cin.get([Array Variable])vorher einen anderen verwenden , um eine Ling-Zeichenfolge mit leerem Zeichen in der Mitte zu greifen. so dass die cin.get()nicht - Eingabeaufforderung Fenster von Schließung vermeiden. Endlich habe ich einen anderen Weg gefunden: Drücken Sie STRG + F5 , um in einem externen Fenster zu öffnen, und Visual Studio hat keine Kontrolle mehr darüber. Ich werde Sie nur nach dem Schließen fragen, nachdem die letzten Befehle ausgeführt wurden.

QMaster
quelle
0

Ich habe versucht, getchar()am Ende eine Funktion zu setzen . Aber es hat nicht funktioniert. Also habe ich zwei getchar()Funktionen nacheinander hinzugefügt . Ich denke, der erste getchar()absorbiert die EnterTaste, die Sie nach der letzten Dateneingabe drücken. Versuchen Sie also, zwei getchar()Funktionen anstelle einer hinzuzufügen

Nathan Tuggy
quelle
0

Anstatt die Run-Taste zu drücken, drücken Sie gleichzeitig STRG und F5. Sie können dann eine beliebige Taste drücken, um die Nachricht fortzusetzen. Oder geben Sie am Ende Ihrer Hauptfunktion "(Warnung nur zum Testen nicht aktueller Programme verwenden, da Antivirenprogramme es nicht mögen !!!!)" ein, aber: (Warnung Verwenden Sie diese Option nur zum Testen nicht aktueller Programme als Antivirenprogramm mag es nicht !!!!)

anony
quelle
0

Verwenden Sie einfach cin.ignore (), bevor Sie 0 zurückgeben. zweimal

main()
  {
  //your codes 

  cin.ignore();
  cin.ignore();

  return 0;
  }

das ist alles

Kursat Turkay
quelle
Normalerweise mache ich so etwas. cin.ignore (); cin.get ();
Aj.toulan
-1

Alles, was Sie tun müssen, um eine Variable für x festzulegen, geben Sie diese einfach vor der Rückgabe 0 ein.

cout<<"\nPress any key and hit enter to end...";
cin>>x;
Freundlicher Rat
quelle
-1

Sie können sogar eine Ganzzahl am Anfang Ihrer main()Funktion deklarieren (z. B. int a;) und std::cin >> a;kurz vor dem Rückgabewert setzen. Das Programm läuft also so lange weiter, bis Sie eine Taste drücken und eingeben.

Izza
quelle