Wie verhindere ich, dass sich mein Programm direkt nach dem ausführen schließt?

2 Antworten

Du kannsr statt stattdessen ein cin << oder getch() machen. Dann wird das Programm nur beendet wenn der Nutzer eine Taste drückt. Oder du kannst das Programm von der Konsole aus ausführen (in der von vscode oder seperat)

Woher ich das weiß:Hobby – Programmiere in meiner Freizeit, hauptsächlich in C
nadyn0185 
Fragesteller
 10.05.2023, 21:49

Aber warum muss ich das denn überhaupt machen, im Internet steht, dass man das gar nicht unbedingt in den Code mit rein schreiben muss, weil es normalerweise auch ohne gehen solle/müsste?

0
ChadThunderhahn  10.05.2023, 21:52
@nadyn0185

Nachdem du eine Ausgabe getätigt hast, wird die Funktion (ohne das system("pause") einen Wert zurückgeben und damit endet das Programm. So ist das mit jedem Programm, da es keinen Sinn ergibt, standardmäßig ein Fenster offen zu haben, wenn das Programm schon beendet ist. Das wäre wie wenn ein Spiel das du spielst noch offenbleibt, damit du dir den Beendenknopf noch angucken kannst.

Du kannst auch das Programm in der Konsole starten, unter Linux geht es mit ./{Programmname} wenn du dich im selben Ordner befindest. Falls du Windows nutzt, musst du nachgucken.

0
nadyn0185 
Fragesteller
 10.05.2023, 23:09
@ChadThunderhahn

Du verstehst nicht ganz, was ich meine.. der Code den ich in meiner Frage angegeben habe ist ein simpler Password Generator, wo ich nach Belieben angeben kann, wie lange das Password ist und das Programm schließt sich halt eben direkt nachdem ich die Zahl eingegeben habe und Enter gedrückt habe und das sollte ein Programm dieser Art nicht machen, wenn man als User den Output des Programmes auch noch sehen sollte.

Um diesen "Fehler" zu beheben, bin ich gezwungen "system("pause");" am Ende jeder meiner Codes zu schreiben damit sich das Programm eben nicht sofort schließt nachdem ich Enter gedrückt habe.

Ich hoffe, du hast jetzt verstanden, was ich meine.

0
ChadThunderhahn  11.05.2023, 00:52
@nadyn0185

Tut mir leid, aber ich verstehe das Problem nicht ganz. Frägst du jetzt nach dem Warum? Wie vorhin erwähnt, nach der Eingabe läuft das Programm weiter, es schreibt was in die Konsole und kommt dann zum return Ausdruck, womit das Programm beendet wird -> Fenster wird geschlossen. ,,system("pause")" führt den Befehl ,,pause" in der Konsole aus und ,,stoppt" damit das Programm weiterzulaufen.

Oder frägst du wie man das verhindert? Deine Lösung ist schon richtig, aber es geht auch ein cin, getc oder sonstiges, was das Programm anhält, zb sleep().

Deine Frage ist zu umständlich formuliert: Im Titel frägst du wie, im ersten Absatz warum.

0
nadyn0185 
Fragesteller
 11.05.2023, 01:13
@ChadThunderhahn
Oder frägst du wie man das verhindert?

Nicht wie, sondern warum ich extra noch Line wie cin, getc oder sonstiges in meinen Code schreiben muss.

Deine Frage ist zu umständlich formuliert: Im Titel frägst du wie, im ersten Absatz warum.

Ist sie nicht, ich frage nach wie vor warum ich cin, getc oder sonstiges überhaupt in meinen Code einbauen muss damit das Programm sich nicht von alleine schließt nachdem ich eine Zahl eingeben habe womit das Programm mir ein zufälliges Password generiert.

Würde ich cin, getc oder sonstiges gar nicht erst in meine Codes einbauen, würde ich niemals sehen, was der Output der Programme eigentlich war und in meinem Fall habe ich ein Beispiel Programm in meiner Frage Beschreibung, welches ein einfacher Password Generator ist, wo ich eine Zahle wie zb 25 eingebe und der Password Generator ein Password mit der Länge von 25 zufälligen Zeichen mir als Output gibt aber das generierte Password sehe ich erst gar nicht, wenn ich cin, getc oder sonstiges erst gar nicht in meine Codes einbaue - daher: warum muss ich das überhaupt machen, wenn es bei anderen wie zb bei dir selbst womöglich auch ohne cin, getc oder sonstiges geht.

0
ChadThunderhahn  11.05.2023, 01:30
@nadyn0185
wenn es bei anderen wie zb bei dir selbst womöglich auch ohne cin, getc oder sonstiges geht.

Weil die anderen die Programme in der Konsole aufrufen und nicht als eine Anwendung durch zweimal auf die .exe draufdrücken. Die Ausgabe (cout) wird dann in der selbigen Konsole, in welcher man es ausführt, ausgegeben.

Führst du es als eine Anwendung aus, öffnet sich ein Fenster, es wird nach der Eingabe gefragt, diese wird akzeptiert, dann wird die Ausgabe gemacht und die main Funktion gibt 0 zurück, das Programm ist beendet. Da wir heutzutage sehr schnelle Rechner haben, passiert der Durchgang von solch einem Programm äußerst schnell, so dass vllt du die Ausgabe nichtmehr sehen kannst, weil das Programm beendet wird.

Da Programme von oben nach unten verlaufen, gehen sie jeden einzelnen Befehl durch. Es geht erst zur nächsten Zeile, wenn die momentane Operation beendet worden ist, von Werte zuweisen bis hin zu Funktionen ausführen. Bei einer Nutzereingabe wartet das Programm so lange, bis ein Enter kommt.

Das heißt, wenn du vor dem return Ausdruck ein cin machst, bleibt das Programm so lange an der Zeile, bis ein Enter kommt. Diese Tatsache kann der Nutzer nutzen, um die Ausgabe zu lesen.

1

Auf Windows OS wird bei Start deiner Anwendung die Konsole als temporärer, ausführender Rahmenprozess geöffnet, der das C++-Programm aufruft und dann auf dessen Antwort (Rückgabewert) wartet. Sobald die Ausführung deiner Anwendung beendet ist, geht die Kontrolle zurück an das Konsolenprogramm, welches damit dann ebenso am Ende seiner Ausführung angekommen ist. Es wird beendet, weil es nichts weiteres zutun hat.

(...) aber wenn "system("pause");" noch am Ende meines Codes dazu geschrieben habe, bleibt es offen aber warum?

Die system-Funktion dient dazu, OS-spezifische Befehle über den Kommandozeileninterpreter des Systems (bei Windows wäre das die cmd.exe), auf dem die Anwendung ausgeführt wird, aufzurufen. Du kannst es dir also so vorstellen, als würde an der Stelle jemand die Windows Konsole öffnen und darin ein (Batch-)Programm aufrufen. Sobald dieses beendet wurde, geht der Ausführungskontext zurück an das C++-Programm.

In deinem Fall wird mit dem pause-Befehl nun ein Programm gestartet, welches auf eine explizite Eingabe vom Nutzer wartet. So lange die ausbleibt, wird es nicht beendet. Das heißt, auch die C++-Anwendung kann nicht fortfahren.

(...) und wenn ich dann Enter drücke, schließt sich das Programm sofort (...)

Die Konsolenausgabe wird noch stattfinden. Allerdings ist die Ausführungsgeschwindigkeit so hoch, sodass du das vermutlich maximal als Flackern wahrnehmen wirst.

Im Internet steht, dass "system("pause");" eigentlich nicht unbedingt benutzt werden muss damit das Programm offen bleibt.

Das generelle Verhalten wird vom OS und dem ausführenden Konsolenprogramm bestimmt. Bei Windows OS triffst du auf das oben beschriebene Verhalten.

Andere Lösungsoptionen statt dem Aufruf der system-Funktion gibt es aber in der Tat. Du könntest bspw. via C++ eine Nutzereingabe fordern:

#include <iostream>

int main() {
  /* do something ... */
  
  cin.get();

  return 0;
}

Das Programm wird dann erst fortgeführt, sobald eine Eingabe geliefert wurde.

Das hat den Vorteil, dass die Ausführung weniger interne Ressourcen fordert, dein Programm C++-pur bleibt und eher portabel. Der pause-Befehl ist immerhin ein Windows OS-spezifisches Programm.

Andererseits könntest du die Eingabeaufforderung auch explizit öffnen und darin dann die Ausführung deiner C++-Anwendung via Befehl starten.