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
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


A voir également:

2 réponses

Utilisateur anonyme
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
2
merci de ta réponse ainsi q'aux autre aussi c'est vraiment sympa de votre part de m'aider
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 ???
0
Utilisateur anonyme
26 mars 2013 à 20:57
Bonjour

petite remarque : c'est if((car>='0')&&(car<='9') car avec || tu vas trouver que tous les caractères sont des chiffres.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 mars 2013 à 21:00
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.
0
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++; 
} 
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 mars 2013 à 19:30
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.
0
[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
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
1
[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
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
0
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
exit(EXIT_FAILURE);
return EXIT_FAILURE; est mieux

Sinon parfait ton code :-).
0
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
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 ?
0
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
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;
0
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
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.
0