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. #21
    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
    La valeur que j'ai en entrée est : 00000 . Cette valeur doit être reconnu comme un entier. Le fait est que le traitement s'arrête en revenant de ma fonction. Il ne rentre pas dans le if... Il sort du traitement complet. Comment es ce que cela se fait.???

  2. #22
    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
    La valeur que j'ai en entrée est : 00000 . Cette valeur doit être reconnu comme un entier. Le fait est que le traitement s'arrête en revenant de ma fonction. Il ne rentre pas dans le if... Il sort du traitement complet. Comment es ce que cela se fait.???
    Je ne sais pas exactement de quel if tu parles. Un probleme courant dans ce genre de situation est d'oublier d'enlever le newline dans une chaine provenant d'un flux texte, donc val contient peut-etre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      { '0', '0', '0', '0', '0', '\n', '\0' }
    ou lieu du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      { '0', '0', '0', '0', '0', '\0' }
    attendu.

  3. #23
    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
    Ce que tu me dit me parrait assez clair... mais je ne suis pas sur que ce soit notre problème... en fait le if dont je parle est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    else if (strncmp(motcle, "DCB BLKSIZE", 12)==0)
        {
            if (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);
            }

  4. #24
    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
    Ce que tu me dit me parrait assez clair... mais je ne suis pas sur que ce soit notre problème... en fait le if dont je parle est le suivant :
    Ok, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    else if (strncmp(motcle, "DCB BLKSIZE", 12)==0)
    L'expression du if est fausse si motcle ne contient pas "DCB BLKSIZE". Attention, ici encore, motcle ne doit pas contenir de \n, sinon strncmp() va echouer. Pourquoi utiliser strncmp() au fait, puisqu'une longueur de 12 va inclure le '\0'?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        {
            if (P302_all_digits(val) != 0)
    Si val est vraiment "00000", l'expression dans le if sera vraie. Verifier que P302_all_digits() renvoit bien 1. Si ce n'est pas le cas, c'est que val contient autre chose que "00000" (par exemple, un '\n').

    Si les deux expressions du if sont bien vraies comme attendu, alors le probleme ce trouve ailleurs dans le code.

  5. #25
    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'utilise strncmp parceque j'ai besoin du \n en fait pour un traitement ulterieur... Ensuite pour ce qui est du deuxieme if... j'ai mis == 0 au lieu de =! 0... et cela marche... ça me parait d'ailleur plus logique de mettre == 0... Je ne vois pas comment la fonction de verification peu envoyé 1... :

    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
    19
     
    int P302_all_digits(const char *s)
    {
    	printf("Entree en P302 \n");
    	printf(" => Valeur en entree : %s \n", s);
        if (s != NULL)    
        {
        	printf(" si s != null : %s\n", s);
            while(*s && isdigit(*s))
            {
            	printf("Affichage de s : %s \n", s);
                s++;
                printf("Affichage de s apres incrementation: %s \n", s);
            }
            printf("Affichage de s apres \0: %s \n", s);
            return *s == '\0';
        }
        return 0;
    }

  6. #26
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    J'utilise strncmp parceque j'ai besoin du \n en fait pour un traitement ulterieur... Ensuite pour ce qui est du deuxieme if... j'ai mis == 0 au lieu de =! 0... et cela marche... ça me parait d'ailleur plus logique de mettre == 0... Je ne vois pas comment la fonction de verification peu envoyé 1... :
    Ici, elle renvoie 1 lorsque *s est égal à 0, c'est à dire quand on est en fin de la chaîne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int P302_all_digits(const char *s)
    {
    ...
            return *s == '\0';
    Il n'y a aucune raison d'inverser le == en !=. Bien sur que cela semble marcher puisque le contraire ne marchait pas. Ceci confirme que DaZumba a très probablement raison, il y a un '\n' avant la fin de la chaîne.Si tu veux le conserver, ta fonction doit le tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return *s == '\0' || *s =='\n' ;

  7. #27
    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 rajouté ce que vous m'avez indiqué, a savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return *s == '\0' || *s =='\n' ;
    Ce n'a rien fait de plus, j'ai le même résultat... Je ne passe pas dans le if qui est après...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        else if (strncmp(motcle, "DCB BLKSIZE", 12)==0)
        {
            if (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);
            }
    Qu'es ce que je peux bien faire pour résoudre mon problème...????... Help, please... :'(

  8. #28
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Alors, il y a un autre caractère que 0 ou '\n' derrière le nombre.
    Le mieux est d'afficher la valeur de *s avant de sortir pour voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            printf("Affichage de s avant sortie: %x \n", *s);
            return *s == '\0' || || *s =='\n'
    SURTOUT ne pas mettre de \0 dans la chaîne de format comme ici. Ceci termine le format !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Affichage de s apres \0: %s \n", s);

  9. #29
    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
    Je me suis rendu compte de cela oui... XD... dit moi à quoi sert le %x ???

    Pour le reste je teste et je poste le retour..

  10. #30
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    Je me suis rendu compte de cela oui... XD... dit moi à quoi sert le %x ???
    A avoir la valeur en hexadécimal, donc brut de brut,sans interprétation du code. C'est ici uniquement pour le test.

  11. #31
    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
    Oki alors voila mes résultats :

    Affichage de s* avant sortie: 15
    Affichage de s avant sortie: 1463d
    Es ce que cela vous parle??? en tout cas pas à moi... XD..

  12. #32
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est un caractère de contrôle. Qu'est-ce qu'il fait là ???
    Es-tu sur que la chaîne est correctement terminée par 0 sinon, on va lire des trucs bizarres en mémoire; ou que si tu as mis un zéro terminal, tu ne l'as pas écrasé ensuite "malencontreusement ?

  13. #33
    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
    Je pense en fait si... ....

    Voila le code un peu plus complet.... :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    int P202_Controle_carte_alloc_02(char* ligne, int i, Carte* l_T_cartes)
    {
        char motcle[12];/* variable qui va contenir le mot cle de ligne lue */
        char val[18];  /* variable qui va contenir la valeur */
        char * sep;    /* variable qui va contenir le separateur */
        motcle[11]= '\0';
        val[17]= '\0';
        printf("Entree P202 \n");
        /* Recherche du separateur dans la chaine */
        printf("Valeur de ligne>%s<\n", ligne);
        sep = strchr(ligne, '=');
        printf("Valeur de sep>%s<\n", sep);
     
        /* Initialisation des variables avec les valeurs correspondantes */
        strncpy(motcle, ligne, 11);
        printf("Valeur de motcle >%s< \n", motcle);
        strcpy (val, sep +1);
        printf("Valeur de val >%s< \n", val);
     
        if (strncmp(motcle, "DCB BLKSIZE", 12)==0)
        {
            if (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';
            }
        }
    Et la fonction pour verifier le type de la chaine :

    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
    19
    int P302_all_digits(const char *s)
    {
     printf("Entree en P302 \n");
     printf(" => Valeur en entree : %s \n", s);
        if (s != NULL)
        {
         printf(" si s != null : %s\n", s);
            while(*s && isdigit(*s))
            {
             printf("Affichage de s : %s \n", s);
                s++;
                printf("Affichage de s apres incrementation: %s \n", s);
            }
            printf("Affichage de s* avant sortie: %x \n", *s);
            printf("Affichage de s avant sortie: %x \n", s);
            return *s == '\0' || *s =='\n' ;
        }
        return 0;
    }
    Es ce que cela éclairci tes idées???

  14. #34
    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
    pffff je suis un flan, je n'ai fait que regarder ce que j'avais en sorti, et je ne me suis même pas soucié de regardé si ça fonctionnais... Et c'est le cas, ça fonctionne... XD ....

    Ceci dit j'ai une autre question, concernant le même thème :

    Es ce que je peux appliquer la fonction que vous m'avez montré (P302_all_digits) au code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            if ((strtol(val, NULL, 10))
            && ((strtol(val, NULL, 10)>=925)
            && ((strtol(val, NULL, 10)<=32460))))
    Et si oui, comment faire??? merci de votre aide...

  15. #35
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Es ce que je peux appliquer la fonction que vous m'avez montré (P302_all_digits) au code suivant :
    Qu'est ce que tu entends par "appliquer la fonction à ce code" ?

  16. #36
    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
    Remplacer strtol par la cette fonction...

  17. #37
    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
    Remplacer strtol par la cette fonction...
    C'est impossible, puisque la fonction all_digits() ne fait pas la conversion en entier. Si tu veux en plus faire la conversion en entier, il faut changer de tactique:
    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
     
    char *p;
    long number = strtol(val, &p, 10);
    if (*p != '\0')
    {
      /* conversion echouee -> il y a surement des caracteres inattendus */
    }
    else
    {
      if (number < 925 || number > 32460)
      {
         /* nombre hors gamme prevue */
      }
      else
      {
        /* tout va bien */
      }
    }
    Comme cela a ete dit plus haut, strtol() fait la verification "tous les caracteres sont numeriques", donc on n'a plus vraiment besoin de all_digits(). Par contre, strtol() est moins selective que all_digits(), puisqu'elle accepte les +, -, espaces...

  18. #38
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    P302_all_digits fait une vérification de la validité de la chaîne, mais ne convertit pas cette chaîne en entier, ce que fait strtol. Tu peux l'utiliser ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long i;        
    if ( P302_all_digits(val) && (i=strtol(val, NULL, 10)) >= 925 && i <= 32460)
    {
     ....
    }

  19. #39
    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
    Oki, oui c'est vrai que la fonction ne fais pas de conversion... Bon ben je vous remercie beaucoup... Je parvient désormais à faire mon traitement complet... Merci ennormément...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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