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?
193
Antworten:
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
main
Funktion 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ürgetchar
.quelle
getchar
löst das Problem nicht - oder zumindest nur unter begrenzten Umständen. Es liest einstdin
Zeichen 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.\n
ist 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. : - /std::cin.ignore(std::cin.rdbuf()->in_avail());
? Habe es von hier bekommen .std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
mit#include <limits>
.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.
quelle
Die Lösung von James funktioniert für alle Plattformen.
Alternativ
Windows
können Sie kurz vor Ihrer Rückkehr von dermain
Funktion Folgendes hinzufügen :Dadurch wird der
pause
Befehl ausgeführt, der wartet, bis Sie eine Taste drücken, und außerdem eine nette Nachricht anzeigtPress any key to continue . . .
quelle
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:
quelle
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.quelle
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.
quelle
main
ist, wenn sie definiert ist. Wenn ich sie jedoch nicht explizit in der Befehlszeile festlege, beendet VS das Fenster, wenn die Anwendung beendet wird. Seufzermain
im 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 VerwirrungFügen Sie vor dem Ende Ihres Codes diese Zeile ein:
Dadurch bleibt die Konsole so lange erhalten, bis Sie eine Taste drücken.
quelle
cin.get();
2 mal anrufen :quelle
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
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.
quelle
Ich habe nicht bemerkt, dass jemand anderes dies gepostet hat, also hier ist es.
quelle
conio.h
ein 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).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.
quelle
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.
quelle
Fügen Sie vor jeder
exit()
Funktion oder vor jedemreturn
s in die folgenden Zeilen einmain()
:quelle
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:
Beachten Sie, dass dies die
tchar.h
Makros verwendet, um mit mehreren 'Zeichensätzen' kompatibel zu sein (wie VC ++ sie nennt).quelle
Ich mache einfach das:
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.
quelle
Verwenden Sie
#include "stdafx.h"
&system("pause");
genau wie den Code unten.quelle
system
wird in deklariert<cstdlib>
, nichtstdafx.h
.Ähnliche Idee wie Ihre Antwort, nur minimalistische Alternative.
Erstellen Sie eine Batchdatei mit folgendem Inhalt:
Verwenden Sie dann die Batch-Datei.
quelle
einfach
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.
quelle
Ü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.quelle
Das scheint gut zu funktionieren:
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.quelle
cin.rdbuf()->in_avail
. Keine magische Zahl wie 1 oder 2.Sie können jederzeit eine Batchdatei erstellen. Wenn Ihr Programm beispielsweise helloworld.exe heißt, lautet der folgende Code:
quelle
Wenn Sie Windows ausführen, können Sie
system("pause >nul");
odersystem("pause");
. Es führt einen Konsolenbefehl aus, um das Programm anzuhalten, bis Sie eine Taste drücken.>nul
verhindert es zu sagenPress any key to continue...
.quelle
Ich setze einen Haltepunkt bei der letzten Rückgabe 0 des Programms. Es funktioniert gut.
quelle
Ich habe verwendet
cin.get()
und das hat funktioniert, aber eines Tages musste ichcin.get([Array Variable])
vorher einen anderen verwenden , um eine Ling-Zeichenfolge mit leerem Zeichen in der Mitte zu greifen. so dass diecin.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.quelle
Ich habe versucht,
getchar()
am Ende eine Funktion zu setzen . Aber es hat nicht funktioniert. Also habe ich zweigetchar()
Funktionen nacheinander hinzugefügt . Ich denke, der erstegetchar()
absorbiert die EnterTaste, die Sie nach der letzten Dateneingabe drücken. Versuchen Sie also, zweigetchar()
Funktionen anstelle einer hinzuzufügenquelle
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 !!!!)
quelle
Verwenden Sie einfach cin.ignore (), bevor Sie 0 zurückgeben. zweimal
das ist alles
quelle
Alles, was Sie tun müssen, um eine Variable für x festzulegen, geben Sie diese einfach vor der Rückgabe 0 ein.
quelle
Sie können sogar eine Ganzzahl am Anfang Ihrer
main()
Funktion deklarieren (z. B.int a;
) undstd::cin >> a;
kurz vor dem Rückgabewert setzen. Das Programm läuft also so lange weiter, bis Sie eine Taste drücken und eingeben.quelle