IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction pour comparer des caractères au numérique


Sujet :

C

  1. #1
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut Fonction pour comparer des caractères au numérique
    Bonjour, je recherche une fonction qui puisse me dire que la chaîne de caractère que je lui donne en entrée est en fait une valeur numérique... Mais avec certaines conditions... Tout d'abord, la valeur 0000 est un numérique pour moi, de même que 1... et 0.... ensuite, la valeur ' 0' n'est pas un numérique puisqu'il y a la présence d'espace dans la chaine...

    J'ai en fait déjà essayé pas mal de choses... Voici mon code actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = fgets(buf_ligne, sizeof(buf_ligne), g_fp);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char val[18];  /* variable qui va contenir la valeur */
    val[18]= '\0';
    sep = strchr(ligne, '=');
    strcpy (val, sep +1);
    if ((strtol(val, NULL, 10)) && ((strtol(val, NULL, 10)>=0)))
    {
            printf("Lecture de %s", motcle);
            strncpy(l_T_cartes[5].Valeur, val, 5);
            l_T_cartes[5].gere   = 'Y';
            printf("Attribution de DCB <%s> \n", l_T_cartes[5].Valeur);
            printf("Gestion de DCB BLKSIZE %c \n", l_T_cartes[5].gere);
            return(g_rc);
    }
    Si quelqu'un peut m'aider... Merci d'avance

  2. #2
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    J'ai également testé atoi... mais ça n'a rien donné non plus... Du moins ça ne répond pas à ce que je recherche... Je sais qu'en Java il existe une fonction toute faite... Existe -t-il une équivalence en C créé par qqun??? merci de votre aide

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2

  4. #4
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Alors oui, mais non... isdigit prend en entré des int... moi ce sera forcément une chaine de caractère en entrée... Ensuite, isdigit compare un à un... Comme je l'ai précisé plus haut, il faut qu'on puisse rentrer la chaine de caractère 0000 en entré et dire qu'en sortie c'est en fait un numérique...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour moi, le plus simple, c'est tenter un strtol() dessus et voir s'il réussit ou non...

  6. #6
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour moi, le plus simple, c'est tenter un strtol() dessus et voir s'il réussit ou non...
    As tu lu mon code?????

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    Bonjour, je recherche une fonction qui puisse me dire que la chaîne de caractère que je lui donne en entrée est en fait une valeur numérique... Mais avec certaines conditions... Tout d'abord, la valeur 0000 est un numérique pour moi, de même que 1... et 0.... ensuite, la valeur ' 0' n'est pas un numérique puisqu'il y a la présence d'espace dans la chaine...
    Bizarre. En general, les espaces ne sont pas un probleme. Je procederais en deux temps, d'abord enlever les espaces (ou compter les espaces et se plaindre s'il y en a), puis faire tourner isdigit() sur tous les caracteres restants.
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int all_digits(const char *s)
    {
      if (s != NULL)
      {
        while(*s && isdigit(*s))
        {
          s++;
        }
        return *s == '\0';
      }
     
      return 0;
    }
    qui renvoit 1 si la chaine est composee de caracteres numeriques au sens de isdigit().

    isdigit prend en entré des int... moi ce sera forcément une chaine de caractère en entrée...
    Un char est en entier, et la conversion char vers int est habituelle. Tu le fais sans le savoir en ecrivant:
    ou en utilisant getchar().

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    Alors oui, mais non... isdigit prend en entré des int... moi ce sera forcément une chaine de caractère en entrée...
    Oui et ?

    Citation Envoyé par Spinoza23 Voir le message
    Ensuite, isdigit compare un à un... Comme je l'ai précisé plus haut, il faut qu'on puisse rentrer la chaine de caractère 0000 en entré et dire qu'en sortie c'est en fait un numérique...
    Il suffit de parcourir la chaine et de tester les caracteres un a un avec la fonction isdigit(), elle sert justement a ca

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    As tu lu mon code?????
    strtol() peut effectivement etre une solution pour ce genre de test, si elle est correctement utilisee.
    Le deuxieme parametre de cette fonction permet de savoir (si il n'est pas nul) ou la conversion s'est arrete. Ainsi si il pointe le \0 terminal, toute la chaine a pu etre converti et donc elle representait bien un nombre [1] dans le cas contraire un caractere n'a pas pu etre converti


    [1] Attention, pour strtol() la chaine peut debuter par un caractere + ou - ou par une serie d'espace sans que cela ne pose de probleme

  10. #10
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Le souci c'est que si la valeur à convertir est égal à "1", la fonction strtol ne peut pas être utilisé... strtol n'est donc pas une solution pour moi.

  11. #11
    Membre averti Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char val[18];  /* variable qui va contenir la valeur */
    val[18]= '\0';
    Sinon, juste une remarque, c'est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char val[18];  /* variable qui va contenir la valeur */
    val[17]= '\0';

  12. #12
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Oui effectivement, je me suis trompé... Pas de conséquence heureusement... Mais taille et position... je la fai à chaque fois... XD... Merci.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je dirais même:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char val[18];  /* variable qui va contenir la valeur */
    val[18-1]= '\0';
    ou même:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef ARRAYSIZE /*macro définie sous Visual mais pas ailleurs*/
    #define ARRAYSIZE(x) ((sizeof x) / (sizeof x[0]))
    #endif
     
    char val[18];  /* variable qui va contenir la valeur */
    val[ARRAYSIZE(val)-1]= '\0';

  14. #14
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Alors ok mais je ne développe pas sous visual... ET val[17] me suffit amplement...

    Pour en revenir à mon problème, j'ai donc créé la fonction all_digits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    int P302_all_digits(const char *s)
    {
    	printf("Entree en P302 \n");
    	printf(" => Valeur en entree : %s \n", s);
        if (s != NULL)
        {
            while(*s && isdigit(*s))
            {
            	printf("Affichage de s : %s \n", s);
                s++;
                printf("Affichage de s apres incrementation: %s \n", s);
            }
            return *s == '\0';
            printf("Affichage de s apres \0: %s \n", s);
        }
        return 0;
    }
    Et l'affichage du resultat est le suivant :

    Entree en P302
    => Valeur en entree : 00000
    Affichage de s : 00000
    Affichage de s apres incrementation: 0000
    Affichage de s : 0000
    Affichage de s apres incrementation: 000
    Affichage de s : 000
    Affichage de s apres incrementation: 00
    Affichage de s : 00
    Affichage de s apres incrementation: 0
    Affichage de s : 0
    Affichage de s apres incrementation:

    Le traitement dans le if de la ou j'appel ma fonction n'est donc pas fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        else if (strncmp(motcle, "DCB BLKSIZE ", 12)==0)
        {
            if ((P302_all_digits(val)) && (P302_all_digits(val)>=0))
            {
                printf("Lecture de %s", motcle);
                strncpy(l_T_cartes[5].Valeur, val, 5);
                l_T_cartes[5].gere   = 'Y';
                printf("Attribution de DCB <%s> \n", l_T_cartes[5].Valeur);
                printf("Gestion de DCB BLKSIZE %c \n", l_T_cartes[5].gere);
                return(g_rc);
            }
            else
            {
                l_T_cartes[5].gere = 'N';
            }
        }
    Pour être honnet j'ai du mal à voir pourquoi le traitement n'est pas effectué... Es ce que quelqu'un peu m'aider???
    Merci

  15. #15
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Je procederais en deux temps, d'abord enlever les espaces (ou compter les espaces et se plaindre s'il y en a), puis faire tourner isdigit() sur tous les caracteres restants.
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int all_digits(const char *s)
    {
      if (s != NULL)
      {
        while(*s && isdigit(*s))
        {
          s++;
        }
        return *s == '\0';
      }
     
      return 0;
    }
    qui renvoit 1 si la chaine est composee de caracteres numeriques au sens de isdigit().
    Pourrai tu s'il te plait me détailler un peu plus cette fonction et son utilité, j'ai un peu de mal à la comprendre... Merci

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    val[17] me suffit amplement
    http://en.wikipedia.org/wiki/Magic_n...rical_constant
    Là, tu utilises DEUX nombres magiques, alors qu'un seul c'est déjà risqué. 18-1 est le minimum à utiliser.

  17. #17
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    Pourrai tu s'il te plait me détailler un peu plus cette fonction et son utilité, j'ai un peu de mal à la comprendre... Merci
    Eh bien, on commence par verifier qu'on ne va pas deferencer un pointeur nul (i.e. ne jamais faire confiance a l'utilisateur!). Ensuite, tant que le caractere a la position *s n'est pas '\0' (fin de chaine) et que isdigit() renvoit une valeur non-nulle, on passe au caractere suivant.
    On a donc deux conditions d'arret de la boucle while:
    1. Le '\0' terminal a ete atteint, donc isdigit() n'a jamais renvoye 0 -> la chaine n'est composee que de caracteres numeriques.
    2. isdigit() a renvoye 0. Du coup, on n'a pas atteint le '\0' terminal. -> la chaine contient au moins un caractere non-numerique.

  18. #18
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Ok c'est un peu plus clair... mais par rapport à mon utilisation, je fais comment??

  19. #19
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Voila ce que j'ai posté plus haut, avec l'affichage du résultat après le traitement...

    Citation Envoyé par Spinoza23 Voir le message
    Pour en revenir à mon problème, j'ai donc créé la fonction all_digits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    int P302_all_digits(const char *s)
    {
    	printf("Entree en P302 \n");
    	printf(" => Valeur en entree : %s \n", s);
        if (s != NULL)
        {
            while(*s && isdigit(*s))
            {
            	printf("Affichage de s : %s \n", s);
                s++;
                printf("Affichage de s apres incrementation: %s \n", s);
            }
            return *s == '\0';
            printf("Affichage de s apres \0: %s \n", s);
        }
        return 0;
    }
    Et l'affichage du resultat est le suivant :




    Le traitement dans le if de la ou j'appel ma fonction n'est donc pas fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        else if (strncmp(motcle, "DCB BLKSIZE ", 12)==0)
        {
            if ((P302_all_digits(val)) && (P302_all_digits(val)>=0))
            {
                printf("Lecture de %s", motcle);
                strncpy(l_T_cartes[5].Valeur, val, 5);
                l_T_cartes[5].gere   = 'Y';
                printf("Attribution de DCB <%s> \n", l_T_cartes[5].Valeur);
                printf("Gestion de DCB BLKSIZE %c \n", l_T_cartes[5].gere);
                return(g_rc);
            }
            else
            {
                l_T_cartes[5].gere = 'N';
            }
        }
    Pour être honnet j'ai du mal à voir pourquoi le traitement n'est pas effectué... Es ce que quelqu'un peu m'aider???
    Merci

  20. #20
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    D'apres l'affichage que tu donnes, on atteint la fin de la chaine, donc all_digits() doit retourner 1. Note que le printf() situe apres le return ne sera jamais execute.
    Ensuite, ta fonction appellante devrait simplement etre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        else if (strncmp(motcle, "DCB BLKSIZE ", 12)==0)
        {
            if (P302_all_digits(val) != 0)
            {

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Fonction pour comparer des dates en matlab
    Par mihaispr dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/07/2009, 16h40
  2. Créer une fonction pour remplacer des caractères
    Par virtuadrack dans le forum C++
    Réponses: 4
    Dernier message: 11/09/2008, 14h52
  3. Réponses: 2
    Dernier message: 27/08/2008, 09h13
  4. fonction pour comparer des nombres
    Par insa59 dans le forum Débuter
    Réponses: 5
    Dernier message: 21/06/2007, 10h34
  5. Réponses: 1
    Dernier message: 10/09/2006, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo