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 :

Comment trier des chaines de caractères


Sujet :

C

  1. #1
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut Comment trier des chaines de caractères
    Bonjour,

    Je recherche une méthode afin de trier des chaines de caractères par ordre croissant contenus dans une struture.
    J'ai parcouru les Tutos et FAQ, mais j'ai trouvé uniquement des exemples sur des INT.

    exemple de la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Exemple {
       char data[100];
    };
     
    struct Exemple Exemple;
    Une fois ce type de structure alimentée, comment faire afin de la trier ?

    Merci

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 338
    Points
    2 338
    Par défaut
    Tu veux trier des chaine par odre alphabetique ? Je te conseille de creuser du cote de la fonction quicksort.

    Sinon, je ne vois pas en quoi ta structure exemple avance ton probleme, ni meme comment tu conpte "l'alimenter" etant donne que c'est un simple tableau de caractere, et non un tableau de chaine de caractere.

  3. #3
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Tu fais exactement de la même manière seulement au lieu de comparer des int tu utilises 'strcmp' qui te permet de comparer des chaînes de caractères. En fonction de la valeur de retour de strcmp tu tries tout ça

    Pour plus d'infos : http://www.linux-kheops.com/doc/man/.../strcmp.3.html

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Aller, c'est bientôt Noël.

    Dépendant de comment tu stockes des chaînes, la solution serait différente. Mais si c'est dans un tableau, ca serait quelque chose comme ca :

    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
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    struct Exemple {
        char data[100];
    };
     
    #define MAX_ELEM 5
     
    struct Exemple exemple[MAX_ELEM] = { {"Test"}, {"Pourquoi"}, {"Pas"}, {"Non"}, {"Oui"}};
     
    int
    ma_comparaison (const void *va, const void *vb)
    {
        const struct Exemple *pa = va,
                       *pb = vb;
     
        return strcmp (pa->data, pb->data);
    }
     
    int
    main (void)
    {
        int i;
        qsort (exemple, MAX_ELEM, sizeof (exemple[0]), ma_comparaison);
     
        for (i=0; i<MAX_ELEM; i++)
            printf ("%s\n", exemple[i].data);
     
        return EXIT_SUCCESS;
    }
    Jc

  5. #5
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Merci à vous pour ces réponses, j'ai du pain sur la planche, je vais tenté de comprendre le fonctionnement du code .
    Comme vous l'avez probablement deviné je ne suis pas un spécialiste du C.

    J' attend un peu pour le tag


  6. #6
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Je viens de tester le code, c'est exactement ce que je veux faire.
    Lors de mes recherche j'avais bien vue cette instruction qsort mais je ne voyais pas comment faire avec des chaines de caractères.

    Cependant j'ai une question concernant l'un des paramètres de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    qsort (exemple, MAX_ELEM, sizeof (exemple[0]), ma_comparaison);
    dans la description du prototype de qsort il est dit que le troisième paramètre représente : Size in bytes of each element in the array.
    (source : http://www.cplusplus.com/reference/c...cstdlib/qsort/)

    Alors pourquoi mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sizeof (exemple[0])
    Je ne comprend pas, cela ne représente pas uniquement la taille de l'élément ayant l'incide 0 ?

  7. #7
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    <...>
    Je ne comprend pas, cela ne représente pas uniquement la taille de l'élément ayant l'incide 0 ?
    Oui, et c'est aussi la taille des autres éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof exemple[0] == sizeof exemple[1] == ... == 100

  8. #8
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Donc si je comprend bien, le tri est effectué pour l'ensemble des éléments du tableau sur la taille de l'élément ayant l'indice 0.

    Si Exemple[0]="toto"
    et Exemple[1]="totosuivant";

    lors du tri ses chaines sont équivalentes, on ne test que sur la longueur de "toto"

    C'est ça ?

  9. #9
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Je pense que tu confonds deux choses l'espace mémoire occupée par Exemple[0] et la longueur de la chaîne "toto", sizeof te fournit l'espace mémoire qui est de 100 puisque :
    pour avoir la taille de la chaîne on utilise strlen, cette dernière donnera 4 comme résultat pour "toto"

  10. #10
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Merci pour cette précision, maintenant c'est clair.
    Du coup, j'ai quelques sources à revoir ......


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/08/2008, 16h00
  2. [VB.NET]comment on filtre des chaines de caractères ?
    Par zouhib dans le forum Windows Forms
    Réponses: 61
    Dernier message: 14/06/2006, 14h33
  3. Réponses: 2
    Dernier message: 03/10/2005, 16h23
  4. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  5. comment vider une chaine de caractère
    Par gaut dans le forum C
    Réponses: 13
    Dernier message: 12/09/2003, 11h30

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