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 :

problème lors de la comparaison d'une chaine de caractere


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut problème lors de la comparaison d'une chaine de caractere
    Bonsoir,

    Comme une autre personne sur ce forum, j'ai un projet où je dois faire une recherche dans un dictionnaire.Problème ce dictionnaire à des mots accentués.
    Là solution que j'ai retenue c'est que lorsque je stocke en mémoire mon dictionnaire je supprime tout les accents de celui-ci.
    Lorsque je fais afficher le résultat cela à l'air d'être bon.
    Mais voila dès que j'utilise le dico j'ai des problèmes de mémoire et comme c'est la seul modification que j'ai faite dernièrement le problème vient de là.

    Voici ce que j'ai 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    char accent( char c)
    {
     
      switch (c)
      {
       case '\340' :
       	 c ='a' ;break;
     
       case '\351' :
       case '\350' :
       case '\352' :
       case '\353' : c ='e' ;break;
     
       case '\356' :
       case '\357' : c ='i' ;break;
     
       case '\364' :
       case '\366' : c ='o' ;break;
     
       case '\373' :
       case '\371' : c ='u' ;break;
       default : break;
      }
     return c;
    }
     
    void suppraccent(char *pChaine)
    {
    	int i=0;
    	while(pChaine[i] != '\0')
    	{
    		pChaine[i]=MinMaj(pChaine[i]);
    		i++;
    	}
    }
    Dans mon projet le codages des caractères utilisés est iso-8859-15 et comme gcc ne veut absolument pas voir 'è' j'ai été forcé de mettre les caractères sous leur forme binaire.

    Mon soucie c'est que je ne vois pas ou peut être l'erreur et je viens demander votre aide.

    Merci de votre aide

  2. #2
    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 l1086 Voir le message
    Mais voila dès que j'utilise le dico j'ai des problèmes de mémoire et comme c'est la seul modification que j'ai faite dernièrement le problème vient de là.
    Ceci marchouille, mais comme, moi aussi ma console n'affiche pas en ISO..., je ne peux pas vraiment vérifier...
    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
     
    #include <stdio.h>
     
    int accent (int c)
    {
     
       switch (c)
       {
       case '\340':
          c = 'a';
          break;
     
       case '\351':
       case '\350':
       case '\352':
       case '\353':
          c = 'e';
          break;
     
       case '\356':
       case '\357':
          c = 'i';
          break;
     
       case '\364':
       case '\366':
          c = 'o';
          break;
     
       case '\373':
       case '\371':
          c = 'u';
          break;
       default:
          break;
       }
       return c;
    }
     
    void suppraccent (char *pChaine)
    {
       int i = 0;
       while (pChaine[i] != '\0')
       {
          pChaine[i] = accent (pChaine[i]);
          i++;
       }
    }
     
    int main (void)
    {
       char s[] = "àçèé";
       puts (s);
       suppraccent (s);
       puts (s);
     
       return 0;
    }
    Par contre, comme la fonction modifie la chaine originale, celle-ci doit être modifiable (ou alors travailler sur une copie modifiable : strdup(), par exemple)

    Attention, il semble que le 'ç' ne soit pas traité.

    Ceci peut aider, mais c'est assez complexe...

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module ASCII

    Ca fait appel à une technique un peu particulière appelée item-lists.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut
    Le ç n'est pas traité simplement parce qu'il n'y en a pas dans le fichier traité, feignantise quand tu nous tiens

    Sinon j'ai plus de précision sur mes erreurs là
    Conditional jump or move depends on uninitialised value(s)
    ==8951== at 0x40235E5: strcmp (mc_replace_strmem.c:341)
    ==8951== by 0x8048B2A: searchdico (optimisation.c:243)
    Et si j'utilise le dico normal sans enlever les accents aucun bug

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Et où se trouve ta fonction searchdico ? Ca sent le log à la Valgrind, si c'est cela, c'est simplement du fait que le tableau que tu utilise (si s'en est un), n'est pas initialisé à 0 (zéro) avant son utilisation, par exemple par un memset.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Par défaut
    merci Franck.H ça marche maintenant
    bon je n'ai toujours pas le résultat attendue mais cela c'est algorithmique

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/08/2009, 12h30
  2. Réponses: 2
    Dernier message: 09/03/2006, 15h24
  3. [JDesktopPane] Problème lors de l'insertion d'une JInternalFrame
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 21/09/2005, 01h38
  4. [POO] Problème lors de l'appel d'une propriété d'un objet.
    Par akecoocoo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/08/2005, 08h51
  5. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37

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