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 :

lecture de chaine et comparaison


Sujet :

C

  1. #21
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par rafale001 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (4 == strspn (".bmp", argv[1])) // on vérifie que le nom de fichier est bien un *.bmp 
    		{
    			n = load(argv[1], img);
     
    			if (n == 1)
    			{
    				printf("image chargée correctement\n");
     
    			}
    le voila, mais je ne vois pas en quoi ca résoud le chmilblic.

    J'ai aussi essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncmp (".bmp", argv[1], 3)
    Le soucis reste le même, ces fonctions regardent si les lettres sont présentes dans le nom de fichier, mais ne regarde pas la fin, et plus précisement le " .bmp"
    C'est pour ça qu'on a proposé d'autres solutions :
    1. Il faut plutôt utiliser strlen() et strncmp()...
    2. Ou la recherche du dernier '.' avec strrchr() et tester la suite...
    3. donc 'strstr' puis le test du 0 à pointeur + 4.

    La première est plutôt gore, mais les 2 suivantes sont bonnes. A toi de jouer.

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut
    Je ne vois pas la différence entre strncmp et strspn. J'obtiens le même résultat

    Mais je vais essayer de combiner strlen et strncmp

  3. #23
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par hegros Voir le message
    Il serait même préférable d'utiliser strcasecmp pour les problèmes de casse car tu pourrais avoir un fichier d'extension .bmp ou .BMP
    L'embrouille pas. On va déjà trouver un algo qui fonctionne... On verra ce détail après.

    En plus, cette fonction n'est pas standard...

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut
    c'est tout bon !

    Je n'ai pas eu besoin de mettre strlen en plus, seule strncmp permet de résoudre le problème, j'ai dû faire une erreur précédemment.

    Merci à tous pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strncmp (".bmp", argv[1], 4))

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut
    Juste au passage, mon code vous semble-t-il correcte ?

    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
    void parcours_profondeur (struct arbre* racine) 
    {
    	if (racine != NULL)
    	{ 
    		if (racine->droite == NULL)
    		{
    			printf("%d",racine->valeur);
    			return;
    		}
    		else
    		{
    			parcours_profondeur (racine->droite);
    			parcours_profondeur (racine->gauche);
     
    		}
    	}	
    	return;
    }
    L'idée est d'afficher les valeurs uniquement des feuilles de l'arbre.

  6. #26
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par rafale001 Voir le message
    c'est tout bon !

    Je n'ai pas eu besoin de mettre strlen en plus, seule strncmp permet de résoudre le problème, j'ai dû faire une erreur précédemment.

    Merci à tous pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strncmp (".bmp", argv[1], 4))
    Je le sens pas trop là...
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       if (strncmp (".bmp", "xxx.bmp", 4) == 0)
       {
          puts ("OK");
       }
       else
       {
          puts ("KO");
       }
       return 0;
    }
    et comme le supposais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    KO
     
    Press ENTER to continue.

  7. #27
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    pt = strstr(nomFichier, ".bmp");
    if(!pt) 
    {
    pt = strstr(nomFichier, ".BMP");  // c'est un peu bidon comme méthode -> et "bMp" ?
    if(!pt) goto pasBon;
    }
    if(pt[4] != 0) goto pasBon;
     
    // ici il est sur que nomFichier se termine par ".bmp" ou ".BMP"
    // mais cela exclu quelque chose comme "fichier.bmp.bmp"

  8. #28
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Stabia Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    pt = strstr(nomFichier, ".bmp");
    if(!pt) 
    {
    pt = strstr(nomFichier, ".BMP");  // c'est un peu bidon comme méthode -> et "bMp" ?
    if(!pt) goto pasBon;
    }
    if(pt[4] != 0) goto pasBon;
     
    // ici il est sur que nomFichier se termine par ".bmp" ou ".BMP"
    // mais cela exclu quelque chose comme "fichier.bmp.bmp"
    Le principe est intéressant, mais il subsiste des cas douteux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ERR at test #12 : '.bmp' : OK
    ERR at test #22 : 'x.x.bmp.bmp' : KO
     
    Press ENTER to continue.
    avec
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    /* delahaye.emmanuel.free.fr/clib/ */
    #include "ed/inc/str.h"
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int test_nfic (char const *nomFichier, char const *ext)
    {
       int ok = 0;
       char *slwr = strdup (nomFichier); /* POSIX.1 */
       if (slwr != NULL)
       {
          STR_tolower (slwr);
          char *pt = strstr (slwr, ext);
          if (pt != NULL)
          {
             ok = pt[strlen(ext)] == 0;
          }
          free (slwr);
       }
       return ok;
    }
     
    int main (void)
    {
       struct test
       {
          int n;
          char const *in_fname;
          int out_ok;
       };
     
       struct test a[] = {
          {10, "", 0},
          {11, "x", 0},
          {11, "bmp", 0},
          {12, ".bmp", 0},
          {12, "x.bmp.x", 0},
          {20, "x.bmp", 1},
          {21, "x.x.bmp", 1},
          {22, "x.x.bmp.bmp", 1},
          {23, "x.BMP", 1},
          {24, "x.BmP", 1},
       };
     
       int err = 0;
       size_t i;
       for (i = 0; i < sizeof a / sizeof *a; i++)
       {
          struct test *p = a + i;
          int ok = test_nfic (p->in_fname, ".bmp");
          if (ok != p->out_ok)
          {
             printf ("ERR at test #%d : '%s' : %s\n", p->n, p->in_fname,
                     ok ? "OK" : "KO");
             err = 1;
          }
       }
       if (!err)
       {
          puts ("P A S S E D");
       }
       return 0;
    }
    Je passe le test avec ce code :
    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
     
    int test_nfic (char const *nomFichier, char const *ext)
    {
       int ok = 0;
       char *slwr = strdup (nomFichier);
       if (slwr != NULL)
       {
          STR_tolower (slwr);
          char *pt = strrchr (slwr, '.');
          if (pt != NULL && pt != slwr)
          {
             ok = strcmp(pt, ext) == 0;
          }
          free (slwr);
       }
       return ok;
    }

  9. #29
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Emmanuel

    ca ne devrait plutôt pas être 1 car .bmp est ok ?


    voici le code avec la fonction qui va bien

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
     
    int test_nfic (char const *nomFichier, char const *ext) {
     
        /* passage en majuscule */
        char * fichier = strdup(nomFichier);
        char * extension = strdup(ext);
     
        int i=0;
        while(extension[i++])
            extension[i]=toupper(extension[i]);
     
        i=0;
        while(fichier[i++])
            fichier[i]=toupper(fichier[i]);
     
     
        size_t lg = strlen(fichier);
        int ok;
         if (strcmp(fichier+lg-4,extension) ==0)
            ok=1;
        else
            ok=0;
     
        free(fichier),free(extension);
     
        return ok;
     
    }
     
    int main (void) {
        struct test {
            int n;
            char const *in_fname;
            int out_ok;
        };
     
        struct test a[] = {
                              {
                                  10, "", 0
                              }, {
                                  11, "x", 0
                              }, {
                                  11, "bmp", 0
                              }, {
                                  12, ".bmp", 1
                              }, {
                                  12, "x.bmp.x", 0
                              }, {
                                  20, "x.bmp", 1
                              }, {
                                  21, "x.x.bmp", 1
                              }, {
                                  22, "x.x.bmp.bmp", 1
                              }, {
                                  23, "x.BMP", 1
                              }, {
                                  24, "x.BmP", 1
                              },
                          };
     
        int err = 0;
        size_t i;
        for (i = 0; i < sizeof a / sizeof *a; i++) {
            struct test *p = a + i;
     
            int ok = test_nfic (p->in_fname, ".bmp");
            if (ok != p->out_ok) {
                printf ("ERR at test #%d : '%s' : %s\n", p->n, p->in_fname,
                        ok ? "OK" : "KO");
                err = 1;
            }
        }
     
        if (!err) {
            puts ("P A S S E D");
        }
        return 0;
    }
    En mettant 1 à la place de 0 pour le test 12 ca passed

  10. #30
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par hegros Voir le message
    En mettant 1 à la place de 0 pour le test 12 ca passed
    Je verrais ça plutôt comme ça :
    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
     
    int test_nfic (char const *nomFichier, char const *ext)
    {
       int ok = 0;
       /* passage en minuscule */
       char *fichier = strdup (nomFichier);
       if (fichier != NULL)
       {
          {
             int i = 0;
     
             while ((fichier[i] = tolower (fichier[i])) != 0)
             {
                i++;
             }
          }
          ok = strcmp (fichier + strlen (fichier) - strlen (ext), ext) == 0;
          free (fichier);
       }
       return ok;
    }
    Mais le nom de fichier du test 12 (.bmp) est-il acceptable ? Il faut voir ce que demande le client.

    En principe, on ne modifie pas les conditions de tests pour que ça simplifie le codage ! Les conditions de tests doivent répondre strictement à la demande du client.

    Si les cas ne sont pas définis, on dit 'comportement indéfini'. Et ça devient un bug.

  11. #31
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    C'est vrai cela ne se fait pas de modifier un test pour accepter le codage

    Trés trés sympa d'écrire des tests comme cela

  12. #32
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par hegros Voir le message
    C'est vrai cela ne se fait pas de modifier un test pour accepter le codage

    Trés trés sympa d'écrire des tests comme cela
    Ca permet de faire des tests unitaires facilement. Attetion, les tests unitaires permettent de valider un comportement, mais pas de déterminer si il y a des comportements indéfinis. Seul un compilateur bien réglé, complété par un contrôle visuel par un expert du langage permet ça...

    Ca se fait avant évidement.

Discussions similaires

  1. lecture de chaines de caractères
    Par berberat dans le forum Langage
    Réponses: 10
    Dernier message: 16/08/2008, 00h21
  2. Lecture de chaine avec fgetc ou getc
    Par muquet dans le forum C
    Réponses: 25
    Dernier message: 19/07/2007, 14h59
  3. lecture de fichier avec comparaison
    Par idsec dans le forum Web
    Réponses: 1
    Dernier message: 25/04/2007, 17h25
  4. [C#]Lecture de chaine dans un buffer
    Par despeludo dans le forum Framework .NET
    Réponses: 3
    Dernier message: 19/01/2007, 23h13
  5. lecture de chaine de caractères
    Par Halloula dans le forum C
    Réponses: 3
    Dernier message: 07/01/2007, 10h41

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