Verwendung der Funktion exit ()

99

Ich möchte wissen, wie und wann ich die exit()Funktion wie das Programm in meinem Buch verwenden kann:

#include<stdio.h>

void main()
{
    int goals;
    printf("enter number of goals scored");
    scanf("%d",&goals);

    if(goals<=5)
        goto sos;
    else
    {
        printf("hehe");
        exit( );
    }
    sos:
    printf("to err is human");
}

Wenn ich es ausführe, wird ERROR: call to undefined function exit () angezeigt .

Außerdem möchte ich wissen, wie ich eine Option zum Schließen des Fensters erstellen kann, in dem das Programm ausgeführt wird. Zum Beispiel habe ich ein menügesteuertes Programm erstellt, das mehrere Optionen hatte, und eine davon war "Menü verlassen" . Wie kann ich das Programm beenden (dh das Fenster schließen)?

Krake
quelle
8
Wenn Sie Antworten wünschen, formatieren Sie Ihren Code und Ihre Frage, damit die Leute sie lesen können. UND NICHT SCHREIEN!
3
Das Codeformat ist eine Sache, aber diese ist schlecht geschrieben. Sie wollen keine Antworten, die so aussehen, oder?
Kobi
53
oy! gotos und aussteigen? Meine Augen! Sie brennen!
Kyle
8
Ich bin kein C-Experte und kann es auch nicht ohne Schwierigkeiten schreiben, also kann ich mich irren ... aber darf ich vorschlagen, dass Sie das Buch wegwerfen? Die Verwendung von goto in C ist wie ... wie ... ich weiß es nicht. Und wenn Sie mich jetzt entschuldigen, haben sie herausgefunden, wie man Türen öffnet * versteckt sich in der Küche * ...
Bobby
8
Nun, goto ist immer noch eine gültige Syntax in C. Sie kann stilistisch abgelehnt werden , ist aber immer noch gültig. void main()OTOH ist einfach falsch . Genauso wie exit();es falsch ist und das Weglassen #include <stdlib.h>falsch ist.
Wildplasser

Antworten:

165

Versuchen Sie es exit(0);stattdessen. Die exitFunktion erwartet einen ganzzahligen Parameter. Und vergiss es nicht #include <stdlib.h>.

Klaus Byskov Pedersen
quelle
2
Auf der Manpage steht "` Die Verwendung von EXIT_SUCCESS und EXIT_FAILURE ist etwas portabler (für Nicht-UNIX-Umgebungen) als die Verwendung von 0 und einigen Werten ungleich Null wie 1 oder -1. "
Mawg sagt, Monica
82

Die exitFunktion ist im stdlib-Header deklariert, also müssen Sie haben

#include <stdlib.h>

an der Spitze Ihres Programms, um verwenden zu können exit.

Beachten Sie auch, dass exitein ganzzahliges Argument erforderlich ist, sodass Sie es nicht so aufrufen können, sondern exit()als exit(0)oder aufrufen müssen exit(42). 0 bedeutet normalerweise, dass Ihr Programm erfolgreich abgeschlossen wurde und Werte ungleich Null als Fehlercodes verwendet werden.

Es gibt auch vordefinierte Makros EXIT_SUCCESSund EXIT_FAILUREzexit(EXIT_SUCCESS);

Tyler McHenry
quelle
3
+1, um nicht nur zu erwähnen, dass exitein ganzzahliges Argument erforderlich ist, sondern auch zu erklären, warum ein ganzzahliges Argument erforderlich ist und dass einige Compiler das explizite Argument benötigen #include <stdlib.h>.
Variadicism
Die genannten vordefinierten Makros werden in der Kompilierungszeit definiert, nicht wahr?
Carloswm85
11

exit(int code);ist in deklariert, stdlib.hso dass Sie eine benötigen

#include <stdlib.h>

Außerdem:
- Sie haben keinen Parameter für das exit(), es erfordert einen intso bereitgestellten.
- Brennen Sie dieses Buch, es verwendet, gotowas (für alle außer Linux-Kernel-Hackern) schlecht, sehr, sehr , sehr schlecht ist.

Edit:
Oh, und

void main()

ist auch schlecht, es ist:

int main(int argc, char *argv[])
Morfildur
quelle
Ja, es steht in dem Buch, dass du der Vollständigkeit des Buches halber besser nicht goto bt verwenden sollst. Ich gebe dir nur ein Beispiel ... also ist das Buch nicht so schlecht !!
Kraken
5
gotoist gelegentlich das Richtige (und der Linux-Kernel bietet viele Beispiele dafür, aber es ist nicht der einzige Code, der ihn verwenden kann). Aber das Beispiel von OP ist eindeutig nicht einer dieser Fälle, also sollte dieses Buch verbrannt werden :).
Adam Rosenfield
11

Versuchen Sie, den Mann zu verlassen .


Oh und:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}
Bertrand Marron
quelle
Versuchen Sie genauer, "man 2 exit" von einer Konsole aus. Die c-Dokumente sind ziemlich detailliert.
Justin
Richtig, Sie sind @ Bertrand Marron
Justin
7

Die exit()Funktion ist ein Funktionstyp mit einem Rückgabetyp ohne Argument. Es wird durch die stdlib-Headerdatei definiert.

Sie müssen ( exit(0) or exit(EXIT_SUCCESS))oder (exit(non-zero)oder verwenden exit(EXIT_FAILURE) ).

Nataraj Raja
quelle
4

Das folgende Beispiel zeigt die Verwendung der exit()Funktion.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("Start of the program....\n");
    printf("Exiting the program....\n");
    exit(0);
    printf("End of the program....\n");
    return 0;
}

Ausgabe

Programmstart .... Programm
beenden ....

Martin max
quelle
2

Sie müssen eine Zeile mit hinzufügen #include <stdlib.h>, um diese Header-Datei einzuschließen, und exiteinen Wert zurückgeben, also weisen Sie eine Ganzzahl in zu exit(any_integer).

user4508201
quelle
2

Zusätzlich zum Zurückgeben eines Exit-Codes an den übergeordneten Prozess -

Unter UNIX ist ein wichtiger Aspekt, der meiner Meinung nach weggelassen wurde, dass exit () beim ersten Aufruf (in umgekehrter Reihenfolge) alle Funktionen aufruft, die durch den Aufruf von atexit () registriert wurden.

Weitere Informationen finden Sie in SUSv4.

ultimative Ursache
quelle
1

Unter Unix-Betriebssystemen gehört exit zur Gruppe der Systemaufrufe. Systemaufrufe sind spezielle Aufrufe, mit denen Benutzercode (Ihr Code) Kernelcode aufrufen kann. Wenn Sie den Aufruf beenden, werden einige betriebssystemspezifische Bereinigungsaktionen ausgeführt, bevor die Steuerung an das Betriebssystem zurückgegeben wird. Dadurch wird das Programm beendet.

#include <stdlib.h>

// example 1
int main(int argc, char *argv){
  exit(EXIT_SUCCESS);
}

// example 2
int main(int argc, char *argv){
  return 0;
}

Einige Compiler geben Ihnen den gleichen Opcode aus diesen beiden Beispielen, andere nicht. Zum Beispiel enthält der Opcode der ersten Funktion keinen Opcode für die Stapelpositionierung, der wie bei jeder anderen Funktion im zweiten Beispiel enthalten ist. Sie könnten beide Beispiele zusammenstellen und zerlegen, und Sie werden den Unterschied sehen.

Sie können exit aus einem beliebigen Teil Ihres Codes verwenden und sicherstellen, dass der Prozess beendet wird. Vergessen Sie nicht, einen ganzzahligen Parameter anzugeben.

Filvarga
quelle
-2

Schreiben Header - Datei #include<process.h>und ersetzen exit();mit exit(0);. Dies wird definitiv in Turbo C funktionieren; für andere Compiler weiß ich nicht.

Azeem Alvi
quelle
1
<process.h> `ist kein Standard. Die exitFunktion ist in deklariert <stdlib.h>.
Keith Thompson
<process.h> löst dieses Problem nicht. Haben Sie die gestellte Frage verstanden?
CuriousMind
-3

Schlechte Programmierpraxis. Die Verwendung einer goto-Funktion ist ein vollständiges Nein Nein in der C-Programmierung.
Fügen Sie auch die Header-Datei stdlib.h hinzu, indem Sie #include <iostream.h>für die Verwendung der exit()Funktion schreiben . Denken Sie auch daran, dass die Funktion exit () ein ganzzahliges Argument akzeptiert. Verwenden Sie exit(0)diese Option, wenn das Programm erfolgreich abgeschlossen wurde, und beenden Sie die exit(-1)Funktion mit einem Wert ungleich Null als Argument, wenn das Programm einen Fehler aufweist.

Gaurav
quelle
1
<iostream.h>ist spezifisch für C ++ und hängt nicht mit <stdlib.h>dem tatsächlich benötigten Header zusammen. Die einzigen tragbaren Argumente für die exitFunktion sind 0, EXIT_SUCCESSund EXIT_FAILURE. Die Verwendung eines Werts ungleich Null zur Bezeichnung eines Fehlers ist spezifisch für UNIX-ähnliche Systeme (und wahrscheinlich einige andere). Verlassen Sie sich nicht auf tragbaren Code.
Keith Thompson
-4

Nehmen Sie es stdlib.hin Ihren Header auf und rufen Sie es abort();an einer beliebigen Stelle auf, an der Sie Ihr Programm beenden möchten. So was:

switch(varName)
{
    case 1: 
     blah blah;
    case 2:
     blah blah;
    case 3:
     abort();
}

Wenn der Benutzer den Schalter betritt, akzeptiert er dies und gibt es dem Fall 3, in dem Sie die abortFunktion aufrufen . Der Bildschirm wird sofort nach dem Drücken der Eingabetaste verlassen.

Muhammad Ahmad
quelle
6
abortist hier nicht geeignet, es werden keine atexitHandler aufgerufen oder offene Dateipuffer geleert. Es sollte nur für eine abnormale Programmbeendigung verwendet werden, z. B. für fehlgeschlagene Zusicherungen usw. Für eine normale Programmbeendigung exitsollte es verwendet werden.
Adam Rosenfield
-6

Verwenden Sie process.h anstelle von stdlib und iostream ... Es funktioniert zu 100%.

Detamos
quelle
4
Ich weiß nicht, was process.h ist; Es ist sicherlich nicht Standard C und funktioniert nicht auf Systemen, die es nicht bereitstellen. Der <iostream>Header ist spezifisch für C ++; Die Frage ist über C.
Keith Thompson
1
Dies ist nicht Yahoo! Antworten, es ist Stapelüberlauf. Wenn Sie antworten, müssen Sie es zuerst mindestens getestet haben!
wizzwizz4