Condition sur un type
Résolu/Fermé
massy
-
26 mars 2013 à 13:35
khrogos Messages postés 49 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 10 juillet 2013 - 29 mars 2013 à 14:26
khrogos Messages postés 49 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 10 juillet 2013 - 29 mars 2013 à 14:26
A voir également:
- Condition sur un type
- Excel cellule couleur si condition texte - Guide
- Clear type - Guide
- Condition et excel - Guide
- Changer le type de fichier - Guide
- Type de ram - Guide
2 réponses
Utilisateur anonyme
26 mars 2013 à 14:26
26 mars 2013 à 14:26
Bonjour,
Tu peux récupérer ta saisie dans un tableau de caractères, puis tester si c'est des chiffres ou des lettres, à l'aide de la table ascii.
Exemple pour un seul caractère :
scanf(%c,&car);
if((car>='0')||(car<='9') equivaut à if((car>=48)||(car<=57)
c'est un chiffre
Tu peux récupérer ta saisie dans un tableau de caractères, puis tester si c'est des chiffres ou des lettres, à l'aide de la table ascii.
Exemple pour un seul caractère :
scanf(%c,&car);
if((car>='0')||(car<='9') equivaut à if((car>=48)||(car<=57)
c'est un chiffre
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
26 mars 2013 à 14:37
26 mars 2013 à 14:37
Salut massy,
Vois : https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1043372399&id=1043284385
Lis bien, au moins jusqu'au moment où strtol est utilisé, pour comprendre les difficultés liées à la validation de la saisie d'un nombre en C.
Dal
Vois : https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1043372399&id=1043284385
Lis bien, au moins jusqu'au moment où strtol est utilisé, pour comprendre les difficultés liées à la validation de la saisie d'un nombre en C.
Dal
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
27 mars 2013 à 22:59
27 mars 2013 à 22:59
Voilà un exemple adapté :
- si le premier caractère est \n, c'est que l'utilisateur a tapé ENTER sans rien taper, il n'a donc pas tapé un nombre entier
- si *p est égal à \n, l'utilisateur a tapé un nombre entier et ENTER, et la chaîne représentant ce nombre entier utilise moins de caractères que la capacité de st_n
- si *p est égal à \0, l'utilisateur a tapé un nombre entier et ENTER, et la chaîne représentant ce nombre entier utilise tous les caractères que st_n peut stocker
- si *p vaut autre chose, c'est que strtol s'est arrêtée avant d'avoir complètement traité l'ensemble de la saisie, en raison d'un caractère ne pouvant être interprété comme représentant un entier
http://www.cplusplus.com/reference/cstdlib/strtol/
Cela permet d'accepter les saisies suivantes comme étant valides :
etc.
et de rejeter :
etc.
et finalement de disposer dans n de l'entier saisi, converti en type int.
Dal
#include <stdio.h> #include <stdlib.h> /* * Exemple de code de saisie sécurisée de nombres au clavier, * sans utiliser scanf, mais en utilisant fgets et strtol */ #define ST_MAX_LEN 10 int main() { long int n = 0; char st_n[ST_MAX_LEN]; /* chaîne saisie */ char *p; /* pointeur utilisé par strtol */ printf("veuiller saisir un nombre entier (%d caractères max) : ", ST_MAX_LEN); if (fgets(st_n, sizeof(st_n), stdin) != NULL) { n = strtol(st_n, &p, 10); if (st_n[0] != '\n' && (*p == '\n' || *p == '\0')) printf ("Vous avez entré le nombre : %ld\n", n); else { printf("Erreur : vous n'avez pas entré un nombre valide\n"); exit(EXIT_FAILURE); } } return 0; }
- si le premier caractère est \n, c'est que l'utilisateur a tapé ENTER sans rien taper, il n'a donc pas tapé un nombre entier
- si *p est égal à \n, l'utilisateur a tapé un nombre entier et ENTER, et la chaîne représentant ce nombre entier utilise moins de caractères que la capacité de st_n
- si *p est égal à \0, l'utilisateur a tapé un nombre entier et ENTER, et la chaîne représentant ce nombre entier utilise tous les caractères que st_n peut stocker
- si *p vaut autre chose, c'est que strtol s'est arrêtée avant d'avoir complètement traité l'ensemble de la saisie, en raison d'un caractère ne pouvant être interprété comme représentant un entier
http://www.cplusplus.com/reference/cstdlib/strtol/
Cela permet d'accepter les saisies suivantes comme étant valides :
" 12" "+12" "-12"
etc.
et de rejeter :
"12toto" "12.2"
etc.
et finalement de disposer dans n de l'entier saisi, converti en type int.
Dal
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
28 mars 2013 à 20:58
28 mars 2013 à 20:58
exit(EXIT_FAILURE);
return EXIT_FAILURE; est mieux
Sinon parfait ton code :-).
return EXIT_FAILURE; est mieux
Sinon parfait ton code :-).
khrogos
Messages postés
49
Date d'inscription
dimanche 24 mars 2013
Statut
Membre
Dernière intervention
10 juillet 2013
21
28 mars 2013 à 21:06
28 mars 2013 à 21:06
Je m'incruste le temps d'une question : quelle différence entre exit(EXIT_FAILURE);
et return EXIT_FAILURE; ? il me semble que les deux ont le même effet (arret du processus avec envoie de statut au parent ...)
une question de portabilité peut-être ?
et return EXIT_FAILURE; ? il me semble que les deux ont le même effet (arret du processus avec envoie de statut au parent ...)
une question de portabilité peut-être ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
28 mars 2013 à 21:21
28 mars 2013 à 21:21
il me semble que les deux ont le même effet (arret du processus avec envoie de statut au parent ...)
Les deux ont le même effet uniquement dans la fonction main(). Mais, le standard impose que main() renvoie un int et exit() ne renvoie rien (prototype : void exit(int)). Il convient donc d'utiliser return EXIT_FAILURE;
Les deux ont le même effet uniquement dans la fonction main(). Mais, le standard impose que main() renvoie un int et exit() ne renvoie rien (prototype : void exit(int)). Il convient donc d'utiliser return EXIT_FAILURE;
khrogos
Messages postés
49
Date d'inscription
dimanche 24 mars 2013
Statut
Membre
Dernière intervention
10 juillet 2013
21
28 mars 2013 à 21:34
28 mars 2013 à 21:34
au, au temps pour moi, je viens de relire le man, et effectivement,
After exit(), the exit status must be transmitted to the parent process.
j'avais mal lu la première fois.
After exit(), the exit status must be transmitted to the parent process.
j'avais mal lu la première fois.
Modifié par massy le 26/03/2013 à 20:52
mais j'ai un petit problème et si l'utilisateur n'avais pas a saisir un chiffre mais un nombre et a la place il rentre toute une chaîne alors comment faire pour signaler l'erreur ???
26 mars 2013 à 20:57
petite remarque : c'est if((car>='0')&&(car<='9') car avec || tu vas trouver que tous les caractères sont des chiffres.
26 mars 2013 à 21:00
Mais, il faut bien garder à l'esprit que 456 est un nombre mais peut aussi être une chaîne. A toi de voir vraiment ce que tu veux faire.
En C, généralement, on sait à l'avance le type. On effectue à contrôle pour vérifier que c'est le bon type. Mais pas de typage dynamique.
Modifié par MiGoK le 27/03/2013 à 10:12
genre un truc du type :
27 mars 2013 à 19:30
Sinon ton code compte le nombre de chiffres et de lettres dans une chaîne. Cela ne précise pas le nombre de nombres. Un strtol () est plus simple ou alors tu dois prendre en compte d'autres conditions.