Condition sur un type
Résolu
massy
-
khrogos Messages postés 52 Statut Membre -
khrogos Messages postés 52 Statut Membre -
Bonjour,
salut a tous je suis entrain de programmer un tp qu'on nous a donner a la maison
et j'ai rencontrer un problème comment exprimer en c une condition sur un type
exemple:
si (a) est un nombre et je veut avoir une condition du type
si (a) n'est pas un caractère ou chaîne de caractère
ps : j'en ai besoin pour les Controls de saisie
si jamais un utilisateur tape un caractère au lieu d'un nombre comment faire pour s'en rendre compte et imposer une condition pour éviter ce genre de problème
salut a tous je suis entrain de programmer un tp qu'on nous a donner a la maison
et j'ai rencontrer un problème comment exprimer en c une condition sur un type
exemple:
si (a) est un nombre et je veut avoir une condition du type
si (a) n'est pas un caractère ou chaîne de caractère
ps : j'en ai besoin pour les Controls de saisie
si jamais un utilisateur tape un caractère au lieu d'un nombre comment faire pour s'en rendre compte et imposer une condition pour éviter ce genre de problème
2 réponses
-
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-
-
-
Le mieux est de lire le clavier avec fgets() et de tenter de convertir avec strtol() (cf. lien de [Dal]).
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. -
oui exact désolé c'est && et non ||. Si il s'agit d'une chaine il suffit de traiter les caractère un par un.
genre un truc du type :
int i=0; int compteurchiffre = 0; int compteurlettre = 0; while(tabcar[i]!='\0') { if((tabcar[i]>='0')&&(tabcar[i]<='9') compteurchiffre++; else compteurlettre++; i++; } -
Si un caractère n'est un chiffre on ne peut pas conclure qu'il s'agit d'une lettre. Il faut tester d'autres conditions.
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.
-
-
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-
Voilà un exemple adapté :
#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 -
-
-
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; -
-