Utilisation de la fonction exit ()

100

Je veux savoir comment et quand puis-je utiliser la exit()fonction comme le programme de mon livre:

#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");
}

Lorsque je l'exécute, il affiche ERREUR: appel à la fonction non définie exit () .

Aussi, je veux savoir comment je peux créer une option pour fermer la fenêtre dans laquelle le programme s'exécute? Par exemple, j'ai créé un programme piloté par menu qui avait plusieurs options et l'une d'elles était "quitter le menu" . Comment puis-je faire cela pour quitter le programme (c'est-à-dire fermer la fenêtre)?

Kraken
la source
8
Si vous voulez des réponses, formatez votre code et votre question pour que les gens puissent les lire. ET NE CRIEZ PAS!
3
Le format du code est une chose, mais il est mal écrit. Vous ne voulez pas de réponses qui ressemblent à ça, n'est-ce pas?
Kobi
54
oy! gotos et quitter? Mes yeux! Ils brûlent!
Kyle
8
Je ne suis pas un C-Expert et je ne peux pas l'écrire sans difficulté, donc je me trompe peut-être à ce sujet ... mais puis-je suggérer que vous jetiez ce livre? Utiliser goto en C, c'est comme ... genre ... je ne sais pas. Et si vous m'excusez maintenant, ils ont compris comment ouvrir les portes * se cache.dans.la.cuisine * ...
Bobby
8
Eh bien, goto est toujours une syntaxe valide en C. Elle peut être désapprouvée stylistiquement , mais elle est toujours valable. void main()OTOH est tout simplement faux . Tout comme exit();c'est faux, et omettre #include <stdlib.h>est faux.
wildplasser

Réponses:

167

Essayez d'utiliser à la exit(0);place. La exitfonction attend un paramètre entier. Et n'oubliez pas #include <stdlib.h>.

Klaus Byskov Pedersen
la source
2
La page de manuel dit: «L'utilisation de EXIT_SUCCESS et EXIT_FAILURE est légèrement plus portable (pour les environnements non-UNIX) que l'utilisation de 0 et d'une valeur différente de zéro comme 1 ou -1.»
Mawg dit rétablir Monica
82

La exitfonction est déclarée dans l'en-tête stdlib, vous devez donc avoir

#include <stdlib.h>

en haut de votre programme pour pouvoir utiliser exit.

Notez également que exitprend un argument entier, donc vous ne pouvez pas l'appeler comme exit(), vous devez appeler comme exit(0)ou exit(42). 0 signifie généralement que votre programme s'est terminé avec succès et des valeurs différentes de zéro sont utilisées comme codes d'erreur.

Il existe également des macros prédéfinies EXIT_SUCCESSet EXIT_FAILURE, par ex.exit(EXIT_SUCCESS);

Tyler McHenry
la source
3
+1 pour non seulement mentionner que exitprend un argument entier, mais expliquer pourquoi il prend un argument entier et que certains compilateurs exigent l'explicite #include <stdlib.h>.
Variadisme du
Les macros prédéfinies mentionnées sont définies au moment de la compilation, n'est-ce pas?
carloswm85
11

exit(int code);est déclaré stdlib.h, vous avez donc besoin d'un

#include <stdlib.h>

Aussi:
- Vous n'avez pas de paramètre pour le exit(), il en faut un intdonc fournissez un.
- Gravez ce livre, il utilise gotoce qui est (pour tout le monde sauf les pirates du noyau Linux) mauvais, très, très , TRÈS mauvais.

Edit:
Oh, et

void main()

c'est mauvais aussi, c'est:

int main(int argc, char *argv[])
Morfildur
la source
ouais c'est écrit dans le livre qu'il vaut mieux utiliser goto bt par souci d'exhaustivité du livre, je vous donne juste un exemple ... donc le livre n'est pas si mauvais !!
Kraken
5
gotoest parfois la bonne chose à faire (et le noyau Linux en fournit de nombreux exemples, mais ce n'est pas le seul code qui peut l'utiliser). Mais l'exemple d'OP n'est clairement pas l'un de ces cas, alors oui, ce livre devrait être brûlé :).
Adam Rosenfield
11

Essayez la sortie de l'homme .


Oh et:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}
Bertrand Marron
la source
Plus précisément, essayez "man 2 exit" depuis une console. Les documents c sont assez détaillés.
Justin
Right you are @Bertrand Marron
Justin
7

La exit()fonction est un type de fonction avec un type de retour sans argument. Il est défini par le fichier d'en-tête stdlib.

Vous devez utiliser ( exit(0) or exit(EXIT_SUCCESS))ou (exit(non-zero)ou exit(EXIT_FAILURE) ).

Nataraj Raja
la source
4

L'exemple suivant montre l'utilisation de la exit()fonction.

#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;
}

Production

Démarrage du programme ....
Sortie du programme ....

Martin Max
la source
2

Vous devez ajouter une ligne avec #include <stdlib.h>pour inclure ce fichier d'en-tête et exitrenvoyer une valeur afin d'attribuer un entier dans exit(any_integer).

user4508201
la source
2

En plus de renvoyer un code de sortie au processus parent -

Sous UNIX, un aspect important qui, je pense, a été laissé de côté est que exit () au premier appel (dans l'ordre inverse) toutes ces fonctions, qui ont été enregistrées par l'appel atexit ().

Veuillez consulter SUSv4 pour plus de détails.

cause ultime
la source
1

sur unix comme la sortie des systèmes d'exploitation appartient au groupe d'appels système. les appels système sont des appels spéciaux qui permettent au code utilisateur (votre code) d'appeler le code noyau. ainsi exit call effectue certaines actions de nettoyage spécifiques au système d'exploitation avant de retourner le contrôle au système d'exploitation, il met fin au programme.

#include <stdlib.h>

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

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

Certains compilateurs vous donneront le même opcode de ces deux exemples, mais d'autres non. Par exemple, l'opcode de la première fonction n'inclura aucun type d'opcode de positionnement de pile qui sera inclus dans le deuxième exemple comme pour toute autre fonction. Vous pouvez compiler les deux exemples et les démonter et vous verrez la différence.

Vous pouvez utiliser la sortie de n'importe quelle partie de votre code et vous assurer que le processus se termine. N'oubliez pas d'inclure le paramètre entier.

filvarga
la source
-2

Écrivez le fichier d'en-tête #include<process.h>et remplacez-le exit();par exit(0);. Cela fonctionnera certainement dans Turbo C; pour les autres compilateurs, je ne sais pas.

Azeem Alvi
la source
1
<process.h> `n'est pas standard. La exitfonction est déclarée dans <stdlib.h>.
Keith Thompson
<process.h> ne résoudra pas ce problème. Avez-vous compris la question posée?
CuriousMind
-3

Mauvaise pratique de programmation. L'utilisation d'une fonction goto est un non-non complet en programmation C.
Incluez également le fichier d'en-tête stdlib.h en écrivant #include <iostream.h>pour utiliser exit()function. Souvenez-vous également que la fonction exit () prend un argument entier. Utilisez exit(0)si le programme s'est terminé avec succès et / exit(-1)ou quittez la fonction avec une valeur différente de zéro comme argument si le programme a une erreur.

Gaurav
la source
1
<iostream.h>est spécifique à C ++ et n'est pas lié à <stdlib.h>l'en-tête réellement nécessaire. Les arguments que portables à la exitfonction sont 0, EXIT_SUCCESSet EXIT_FAILURE. L'utilisation de toute valeur différente de zéro pour indiquer l'échec est spécifique aux systèmes de type UNIX (et probablement à certains autres); ne comptez pas dessus dans le code portable.
Keith Thompson
-4

Incluez stdlib.hdans votre en-tête, puis appelez abort();à n'importe quel endroit où vous souhaitez quitter votre programme. Comme ça:

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

Lorsque l'utilisateur entre, le commutateur l'accepte et le donne au cas 3 où vous appelez la abortfonction. Il quittera votre écran immédiatement après avoir appuyé sur la touche Entrée.

Muhammad Ahmad
la source
6
abortn'est pas la chose appropriée à appeler ici, il n'appellera pas de atexitgestionnaires ni ne videra les tampons de fichiers ouverts. Il ne doit être utilisé que pour la terminaison anormale du programme, par exemple des assertions échouées, etc. Pour la fin normale du programme, il exitdoit être utilisé.
Adam Rosenfield
-6

Utilisez process.h au lieu de stdlib et iostream ... Cela fonctionnera à 100%.

Detamos
la source
4
Je ne sais pas ce qu'est process.h; ce n'est certainement pas le standard C et ne fonctionnera pas sur les systèmes qui ne le fournissent pas. L'en- <iostream>tête est spécifique au C ++; la question concerne C.
Keith Thompson
1
Ce n'est pas Yahoo! Réponses, c'est Stack Overflow. Si vous répondez, vous devez au moins l'avoir testé en premier!
wizzwizz4