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

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 3
    Points
    3
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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"...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    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
    Points : 6 498
    Points
    6 498
    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

  7. #7
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Trap D Voir le message
    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;
    }
    Mais attention la norme ne spécifie que "C" (paramètres du langage C) et "" (paramètres de l'environnement d'exécution) comme valeurs de l'argument locale de setlocale. Mais l'implémentation a le droit d'étendre ces valeurs. Le mieux, c'est de regler son système suivant les paramètres français, puis d'appeler : Au fait dans ton programme, je crois qu'il manque encore stdio.h (puts) .

  8. #8
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Melem Voir le message
    Au fait dans ton programme, je crois qu'il manque encore stdio.h (puts) .
    Oui, il y est par défaut, je l'ai fait avec Visual Studio et j'ai viré à l'affichage du prog le "stdafx.h"

    Pour le reste, j' ai toujours fait comme çà.

    Maintenant, (je pose la question car je n'ai vraiment aucune idée de la réponse quoique) si on fait un programme destiné à être installé sur un grand parc de machines hétéroclites, qu'est ce qui est le mieux ? Supposer que toutes les machines sont bien configurées et faire un setlocale(LC_ALL, ""); ou forcer le setlocale(LC_ALL, "French"); au risque d'écrire un code qui ne soit pas forcément portable, mais puisqu'il est vendu compilé ...
    "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

  9. #9
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    En fait le problème de la portabilité c'est seulement au niveau du code source. Une fois compilé ça donne du code natif pour le système cible. Donc dans ton cas, puisqu'on s'est déjà fixé le système sous lequel le programme est destiné à fonctionner, je ne vois aucune raison de me priver d'utiliser setlocale(LC_ALL, "French") .

  10. #10
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Deja merci pour toutes vos reponses.
    le probleme et aussi que je dispose de plusieurs tableau dans differentes langues donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale( LC_ALL, "French" );
    avec strcoll
    n'est pas vraiment possible .
    Pour l'instant la seule solution(sans doublons) que je possede est de faire un parcours de tout le tablaeau plutot qu'une recherche dichotomique ce qui est beaucoup plus long.

  11. #11
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    T'as complètement changé de sujet on dirait. Ton problème au départ c'était pas :
    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 .
    ?

    Si tu veux pouvoir comparer e et é, a et à, etc. de sorte qu'ils soient égaux, fais comme ce que l'on t'a montré.
    Citation Envoyé par krosian
    Pour l'instant la seule solution(sans doublons) que je possede est de faire un parcours de tout le tablaeau plutot qu'une recherche dichotomique ce qui est beaucoup plus long.
    Si le tableau est déjà ordonné fais une recherche dichotomique, tu vas perdre ton temps pour rien

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