Exit() en C

Résolu
anthony -  
 anthony -
Bonjour,
J'ai lu que il faut utiliser exit(EXIT_SUCCESS) quand la valeur est égale à 0, et quand la valeur est égale à 1, il faut utiliser exit(EXIT_FAILURE).
Mais comment on sait si la valeur est égale a 1 ou 0 ??

7 réponses

fiddy Messages postés 11653 Statut Contributeur 1 847
 
exit(EXIT_SUCCESS) vaut pareil que exit(0) ce qui signifie que le programme s'est bien déroulé.
En revanche, rien ne dit dans la norme EXIT_FAILURE vale 1.

Cdlt,
1
anthony
 
ok EXIT_SUCCESS vaut 0
En revanche, rien ne dit dans la norme EXIT_FAILURE vale 1. 

donc il vaut quoi ?
0
Attaqua Messages postés 354 Statut Membre 16
 
Lorsque la valeur que renvoie le main est 0, c'est que tout s'est très bien passé. Lorsqu'il renvoie 1 c'est que ça ne s'est pas bien passé. En fait, EXIT_SUCCESS et EXIT_FAILURE sont des defines situés dans stdio.h. C'est comme NULL pour les pointeurs : c'est 0, mais on le met par convention, pour montrer que c'est bien un pointeur, et non une simple variable !

exit() est souvent utilisé pour sortir d'un programme en cas de problème. On note alors comme cela : exit(EXIT_FAILURE);. On l'utilise dans une condition if() comme dans cet exemple :

int main (int argc, char *argv[])
{

if ( int a = malloc(sizeof(int)) == NULL ) //On alloue et on teste pour voir si malloc renvoie NULL (cas d'erreur)
{
printf("Message d'erreur"); // On affiche "Message d'erreur"

exit(EXIT_FAILURE); // Et on sort. En fait, cette notation équivaut a écrire exit(1); …

}

// Si l'allocation a marché, tu met ton code ici …

return EXIT_SUCCESS; // Qui équivaut toujours a return 0; ...
}

A+ !
0
Nabla's Messages postés 20731 Statut Contributeur 3 193
 
généralement, quand tu débutes en C, tu fais des programmes qui se suffisent à eux meme. Donc pas pas très utile de dire au programme appelant comment s'est déroulé l'execution.

Cependant, si tu veux faire propre, tu faire EXIT_SUCCESS quand le programme s'est bien déroulé, et EXIT_FAILURE lorsque le programme a récupéré une erreur ... mais honnetement, c'est pas le plus interessant lorsque tu débutes la programmation ;)
0
anthony
 
ah ok, mais alors expliquez moi pourquoi ici il utilise exit(EXIT_FAILURE) alors que le programme se déroule très bien
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int menu(void);

int main(void)
{
    int choix;
    while(1)
    {
        choix = menu();

        if(choix == 1)
        {
            puts("\nExécution de la tache correpondante au choix 1.");
            sleep(5);
        }
        else if( choix == 2)
        {
            puts("\nExécution de la tache correpondante au choix 2.");
            sleep(5);
        }
        else if( choix == 3)
        {
            puts("\nExécution de la tache correpondante au choix 2.");
            sleep(5);
        }
        else if( choix == 4)
        {
            puts("\nExécution de la tache correpondante au choix 2.");
            sleep(5);
        }
        else if( choix == 5)
        {
            puts(("\nSortie du programme\n");
            sleep(5);
            break;
        }
        else
        {
            puts("Choix incorrecte, essayer de nouveau");
            sleep(5);
        }
    }
    exit(EXIT_FAILURE);
}

int menu(void)
{
    int reponse;
    
    puts("\nEntrez 1 pour la tache A");
    puts("\nEntrez 2 pour la tache B");
    puts("\nEntrez 3 pour la tache C");
    puts("\nEntrez 4 pour la tache D");
    puts("\nEntrez 5 pour sortir du programme");
    
    scanf("%d", &reponse);
    
    return reponse;
}
0
Nabla's Messages postés 20731 Statut Contributeur 3 193 > anthony
 
la personne s'est trompée.
Elle sort de la boucle avec le break, qui est conditionné par une commande utilisateur, donc ca devrait être exit success.

comme il n'y a qu'un type de sortie possible, personnelement, au lieu de
int main(void)
j'aurai mis
void main(void)
0
fiddy Messages postés 11653 Statut Contributeur 1 847 > Nabla's Messages postés 20731 Statut Contributeur
 
Bonjour,
void main(void) n'est pas standard. La norme impose int main(void) en prototype de main sans argument.
0
anthony > Nabla's Messages postés 20731 Statut Contributeur
 
ah ok c'est pour sa que je trouvais bizzard ce code
j'aurai mis
void main(void)

ah bon j'ai jamais vue sa, ce que j'ai vue moi c'est int main(int argc, char *argv[]) et int main() ou int main(void) mais ton int connais pas
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

donc il vaut quoi ?

EXIT_FAILURE est défini dans stdlib.h et sa valeur dépends de système, pour assurer la portabilité du code vaut mieux utiliser la constante symbolique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Attaqua Messages postés 354 Statut Membre 16
 
Oui, exit(EXIT_FAILURE) vaut autre chose que 0 (booléen) ...
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Re,

En fait EXIT_SUCCESS vaut 0 qui est un entier et pas un booléen, d'ailleurs le type de main est int.

Ce que tu dois retenir ce n'est pas la valeur mais le fait que EXIT_SUCCESS signifie la réussite et EXIT_FAILURE signifie l'échec.

0
Attaqua Messages postés 354 Statut Membre 16
 
Bien sur que EXIT_FAILURE et EXIT_SUCCESS sont des int, puisque bool n'existe pas en C … Mais on continue a les voir comme des booléens : 0 et 1 sont des entiers, et en même temps des booléens !
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
puisque bool n'existe pas en C
En C99, le booléen existe. Son type est _Bool et c'est défini dans stdbool.h

0 et 1 sont des entiers, et en même temps des booléens !
Non, 0 et 1 sont des int, tout comme 'f' est un int (et non un char).
0
Attaqua Messages postés 354 Statut Membre 16 > fiddy Messages postés 11653 Statut Contributeur
 
Je parle dans la vrai vie, pas en prog' ...
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570 > Attaqua Messages postés 354 Statut Membre
 
Re,

Dans la vraie vie parle de booléen à ma mère et tu verras ;-)
0
Attaqua Messages postés 354 Statut Membre 16 > lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité
 
Ce n'est pas seulement une notion de prog' ...
0
fiddy Messages postés 11653 Statut Contributeur 1 847 > Attaqua Messages postés 354 Statut Membre
 
Le topic de cette conversation, c'est le C.
Si après, c'est pour parler dans la vie, on peut dire aussi que 0 et 1 sont des chiffres... Nous voilà bien avancés...
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Re,

Mais on continue a les voir comme des booléens
Seulement dans le cas d'une condition dans if, for, while ou on teste la valeur de vérité et pas la valeur entière.

Le retour de main est un int, un nombre qui est peut être le code de sortie d'un processus fils par exemple et en ce moment ce n'est pas la valeur de vérité qui importe mais la valeur entière.
0
anthony
 
ah ok donc en gros EXIT_SUCCESS = réussite et EXIT_FAILURE = echec, je vais plutôt retenir sa
0
anthony > anthony
 
ah oui et désoler mais je n'arrive pas a mettre le sujet résolue car il mette pas le choix
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570 > anthony
 
Salut,

je n'arrive pas a mettre le sujet résolue
C'est fait ;-)
0
anthony > lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité
 
merci ^^
0