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 :

probleme pour rechercher une chaine dans un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut probleme pour rechercher une chaine dans un tableau
    Bonjour je souhaite rechercher si un mot est dans un tableau(environ 100000 chaines de caracteres trié de facon alphabetiques donc tres long a retrié.) de facon dichotomique en utilisant strcmp
    le probleme est que j'ai certain mot a accent
    exemple : "à" strcmp trouvrera qu'il est plus grand que mouton et donc la recherche ne marchera pas.

    la seul solution que je trouve serait de reecrire strcmp tel que é est la valeur de é par e mais ici le probleme sera qu'il va trouver par exemple un mot àrbre dans le tableau alors qu'il n'y a que arbre

    Si quelqu'un avait une petite idée car là je suis un peu perdu .

  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 krosian Voir le message
    Bonjour je souhaite rechercher si un mot est dans un tableau(environ 100000 chaines de caracteres trié de facon alphabetiques donc tres long a retrié.) de facon dichotomique en utilisant strcmp
    le probleme est que j'ai certain mot a accent
    exemple : "à" strcmp trouvrera qu'il est plus grand que mouton et donc la recherche ne marchera pas.

    la seul solution que je trouve serait de reecrire strcmp tel que é est la valeur de é par e mais ici le probleme sera qu'il va trouver par exemple un mot àrbre dans le tableau alors qu'il n'y a que arbre

    Si quelqu'un avait une petite idée car là je suis un peu perdu .
    C'est pas simple comme problème. Les caractères traités par le C standard sont :

    http://delahaye.emmanuel.free.fr/spip.php?article6

    Ce qu'il faudrait faire, c'est une 'désaccentuation temporaire'

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module ASCII
    Fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ASCII_noacc_ibm (int c, int *const pErr);
    int ASCII_noacc_ansi (int const c);
    dans la fonction de comparaison pour ramener les chaines à des chaines standards, mais ça risque d'introduire des confusions (faux doublons... a / à etc.)

    Sinon, il faut écrire une version étendue de strcmp() qui fonctionnerait avec le charset que tu utilises. Ca risque d'êre long à écrire et lent à exécuter...

    Il y a certainement de méthodes plus élaborées que je ne connais pas. Peut être à voir sur le forum "algorithmes"...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Qu'appelles-tu "ANSI" exactement dans tes fonctions ?
    Les accents sont spécifiques à un charset, et "ANSI" n'en désigne pas spécifiquement un...

    Mais à la présence du symbole Euro dans ton item-list, je dirais que ce que tu appelles "ANSI" est en fait le charset Windows-1252...
    Qui est la page de codes ANSI par défaut sous la plupart des Windows occidentaux. C'est donc une page ANSI (et encore, elle n'a jamais vraiment été standardisée par l'ANSI...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    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 Médinoc Voir le message
    Qu'appelles-tu "ANSI" exactement dans tes fonctions ?
    Oui, je sais, c'est pas très clair. genre Latin-1...

    C'est juste un exemple...

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par krosian
    le probleme est que j'ai certain mot a accent
    exemple : "à" strcmp trouvrera qu'il est plus grand que mouton et donc la recherche ne marchera pas.
    Donc ton programme suppose qu'il va s'exécuter dans un environnement qui connaît ces caractères accentués. Pour comparer des chaînes de manière "logique", c'est-à-dire par rapport aux caractères qui les composent et non par rapport à la représentation binaire de ces caractères, on utilise strcoll qui tient compte de la valeur du paramètre LC_COLLATE des paramètres régionaux en vigueur et non strcmp (qui ne veut rien savoir à part la représentation en mémoire des caractères). Sinon, tu transfomes d'abord les chaînes à comparer avec la fonction strxfrm de sorte que le résultat de strcmp soit ensuite identique à celui de strcoll.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Essaye ce petit programme :
    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
    #include <locale.h>
    #include <ctype.h>
    #include <string.h>
     
     
    int main(int argc, char* argv[])
    {
    	setlocale( LC_ALL, "French" );
     
    	if (isalpha((unsigned char) 'é'))
    		puts("oui");
    	else
    		puts("non");
     
    	if (strcmp("béton", "betterave") < 0)
    		puts("oui");
    	else
    		puts("non");
     
    	if (strcoll("béton", "betterave") < 0)
    		puts("oui");
    	else
    		puts("non");
     
    	return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Réponses: 21
    Dernier message: 28/02/2006, 15h23
  2. [vbexcel]Rechercher une chaine dans une autre chaine...
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/12/2005, 13h49
  3. Probleme pour faire une somme dans header ??
    Par snoop57 dans le forum Access
    Réponses: 7
    Dernier message: 01/12/2005, 13h40
  4. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04
  5. [Tableaux] Recherche d'une chaine dans un tableau
    Par tom06440 dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2005, 23h27

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