Condition sur un type

Résolu
massy -  
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


A voir également:

2 réponses

Utilisateur anonyme
 
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
massy
 
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
 
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   Statut Contributeur Dernière intervention   1 846
 
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
Utilisateur anonyme
 
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   Statut Contributeur Dernière intervention   1 846
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Contributeur Dernière intervention   1 846
 
exit(EXIT_FAILURE);
return EXIT_FAILURE; est mieux

Sinon parfait ton code :-).
0
khrogos Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   21
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   21
 
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