Condition sur un type
Résolu
massy
-
khrogos Messages postés 49 Date d'inscription Statut Membre Dernière intervention -
khrogos Messages postés 49 Date d'inscription Statut Membre Dernière intervention -
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
A voir également:
- Condition sur un type
- Excel cellule couleur si condition texte - Guide
- Clear type - Guide
- Type de ram - Guide
- Excel condition ou - Guide
- Comment changer le type de fichier - Guide
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
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
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
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
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;
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 ???
petite remarque : c'est if((car>='0')&&(car<='9') car avec || tu vas trouver que tous les caractères sont des chiffres.
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.
genre un truc du type :
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.