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 :

Comparaison de chaines


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Par défaut Comparaison de chaines
    Salut tout le monde

    J'ai un probleme. Je souhaite comparer deux chaines de caractére l'un de type char * string l'autre contenu dans une structure. strcmp ne semble pas accéder au champs de la structure, et gcc me renvoie une erreur du genre qu'il ne peut pas comparer une chaine de caracteres et un pointeur... Alors comment faire ???? Voila je vous remercie!!

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par kernerteam
    Alors comment faire ????
    Deux options :
    • soit tu nous montres ton code
    • soit tu nous offres une ...

  3. #3
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Exact, on ne peut rien dire si on ne voit pas ton code

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Par défaut Code
    Voila mon code comme vous me l'avez demander.

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
     
     
     
     
    //Pour l'instant tout est fait de façon trés naive
    //Je n'ai pas fait un programme modulaire exprés
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define L 23//Longeur du tableau
     
     
    int 
    main(void){
     
        //Tableau de pointeurs pour les noms de station
        char *stat[L];
     
        stat[0] = "la_defense";
        stat[1] = "esplanade_de_la_defense";
        stat[2] = "pont_de_neuilly";
        stat[3] = "les_sablons";
        stat[4] = "porte_maillot";
        stat[5] = "argentine";
        stat[6] = "charles_de_gaule_etoile";
        stat[7] = "georgesV";
        stat[8] = "franklin_d.roosvelt";
        stat[9] = "champs_elysees_clemenceau";
        stat[10] = "concorde";
        stat[11] = "tuileries";
        stat[12] = "palais_royale_musee_du_louvre";
        stat[13] = "louvre_rivoli";
        stat[14] = "chatelet";
        stat[15] = "hotel_de_ville";
        stat[16] = "saint_paul";
        stat[17] = "bastille";
        stat[18] = "gare_de_lyon";
        stat[19] = "reully_diderot";
        stat[20] = "nation";
        stat[21] = "porte_de_vincennes";
        stat[22] = "saint_mande";
        stat[23] = "berault";
        stat[24] = "chateau_de_vincennes";
     
        int i = 0;
        int j = 0;
     
        //La structure pour la liste chainé
        typedef struct list
        {
    	int ligne;
    	char *station;
    	struct list *next;
        }List;
     
        List *t;
        List *courant;
        List *q;
     
        t = (List*)malloc(sizeof(List));
        t->ligne = 2;
        t->station = stat[i];
        t->next = NULL;
        courant = t;
     
        while(i<L)
        {
    	q = (List*)malloc(sizeof(List));
    	q->ligne = 1;
    	q->station = stat[i+1];
    	q->next = NULL;
     
    	t->next = q;
    	t = q;
    	i++;
        }
     
        while(j<L)
        {
    	printf("*** %s ***\n",courant->station);
    	courant = courant->next;
    	j++;
        }
     
     
        char nom_station[BUFSIZ];
     
        puts("\n--------------------------\n");
        puts("Verifier une station!\n");
        puts("Pour cela ecrivez le nom d'une station quelqueconque.\n");
        puts("Le programme vous repondra par oui ou par non.\n");
     
        scanf("%s",nom_station);
     
        while(courant != NULL)
        {
    	//Là je veux comparer le nom de station entré par l'utilisateur au nom de station present dans les differents "wagons" de la liste
    	if( (strcmp(nom_station,courant->station) > 0))//Si ils sont différents ils me renvoie NON
           {
    	   printf("NOM");
           }
          else("OUI");
    	courant = courant->next;//Pour pouvoir passer à l'autre "wagon"
     
        }
     
        return EXIT_SUCCESS;
    }
    Voila j'espere avoir été assez claire cette fois. Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    1. Pas de scanf("%s",nom_station);. Très mauvais.
    2. strcmp() peut retourner une valeur inférieure à zéro si les chaînes sont différentes. Utilise != au lieu de >.
    3. Pas de cast au retour de malloc() : c'est inutile en C (quoi que puissent en dire des vieux professeurs).
    4. BUFSIZ ne sert pas à cela. Utilise un #define perso pour ta taille de buffer.
    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.

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    460
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 460
    Par défaut
    stat[0] = "la_defense";
    stat[1] = "esplanade_de_la_defense";
    stat[2] = "pont_de_neuilly";
    ca se fait ca ??

    Pour comparer 2 chaines, tu peux utiliser la fonction strcmp ou stricmp( ca dépend si tu veux prendre en compte la casse), mais pour cela il faut que cela soit 2 char *, il faut donc que tu fasses un cast vers char * de ton string.

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par FamiDoo
    ca se fait ca ??
    Sur le coup, j'eus cru que ça n'allait pas marché, mais en fait, si: c'est bien un
    char * truc[L] donc ça marche.

  8. #8
    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
    Pour fair mieux tu peux aussi virer la structure du main, ca se fait pas vraiment, surtout si en plus tu en fait une petite liste chainée !
    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 !

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Sans aller très loin, je vois au moins 2 erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define L 23//Longeur du tableau
    Ne jamais faire ça ! : le commentaire qui suit la valeur numérique est inclu dans la définition !!!

    donc, plus tard quand tu écrisça revient à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *stat[23//Longeur du tableau];
    et la fin de ta ligne est commentée, comment le compilateur pourrait-il s'y retrouver ?

    D'autre part, tu as mis L = 23
    or, plus loin, je vois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stat[24] = "chateau_de_vincennes";
    il faut donc que L = 25

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Tu es sûr de ton post, là ?

    Je n'ai jamais eu ce problème ni sous Visual ni sous GCC...
    Edit: Peut-être que si l'option "keep comments" du préprocesseur de GCC est activée... Je n'ai pas testé cela...
    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.

  11. #11
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par thewho
    Bonjour,

    Sans aller très loin, je vois au moins 2 erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define L 23//Longeur du tableau
    Ne jamais faire ça ! : le commentaire qui suit la valeur numérique est inclu dans la définition !!!
    Ah bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
     
    #define L 23//hello
     
    int main()
    {
            printf("%d\n",L);
            return 0;
    }
    Me sors :

    ~/tmp$ gcc define.c -Wall -Wextra
    ~/tmp$ ./a.out
    23
    et gcc -E me sors bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
     printf("%d\n",23);
     return 0;
    }
    [EDIT]
    En effet, l'option -CC garde les commentaires mais les transforme en /**/
    ce qui donne :

    gcc -E -CC define.c


    int main()
    {
    printf("%d\n",23/*hello*/);
    return 0;
    }
    [/EDIT]
    Jc

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Ok, j'ai testé et ça marche.

    Je ne fais jamais ça, et je n'avais jamis essayé, car on m'a toujours appris que "dans un #define tout ce qui suit l'identificateur est inclu dans la définition"
    Il est possible que les anciens compilateurs n'aient pas su jouer avec les commentaires ajoutés sur la même ligne.

    Il reste au moins le problème de la valeur de L

  13. #13
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Bonjour, j'ai une question sur une partie du code qui se trouve dans le main() :

    while(i<L)
    {
    q = (List*)malloc(sizeof(List));
    q->ligne = 1;
    q->station = stat[i+1];
    q->next = NULL;

    t->next = q;
    t = q;
    i++;
    }


    Est-ce que free() est implicite à la sortie de la fonction?

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    Par défaut
    Ben non, le free n'est JAMAIS implicite en C.
    "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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Et en C, le cast au retour de malloc() doit être supprimé.
    Il n'est pas en soi nuisible, à cela près qu'il peut cacher un oubli d'inclusion de <stdlib.h> si on compile sans warnings.
    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.

  16. #16
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Oui voilà comment avec 50 lignes de codes on se retrouve avec 4Ko de fuite dans la mémoire sur chaque exécution.

    Chaque allocation dynamique de mémoire demande une libération manuelle avec free().
    Ca personne ne le fera à la place du programmeur, c'est une des très rares choses de sa responsabilité vis à vis du système d' exploitation, en langage C.

    Besoin d 'aide, incontestablement. Ca ne s'invente pas.
    En se basant exclusivement sur ce que tu nous montres, le prog se résume à quelques lignes:

    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
    #include <stdio.h>
    #include <string.h>
     
    #define L 25
     
    int main()
    {
      char strin [256];
      unsigned char n, m=0;
     
      typedef struct
      {
        unsigned int ligne;
        char *station;
      } uneListe;
     
      uneListe maListe[L]={
                {1,"la_defense"},
                {1,"esplanade_de_la_defense"},
                {1,"pont_de_neuilly"},
                {1,"les_sablons"},
                {1,"porte_maillot"},
                {1,"argentine"},
                {1,"charles_de_gaule_etoile"},
                {1,"georgesV"},
                {1,"franklin_d.roosvelt"},
                {1,"champs_elysees_clemenceau"},
                {1,"concorde"},
                {1,"tuileries"},
                {1,"palais_royale_musee_du_louvre"},
                {1,"louvre_rivoli"},
                {1,"chatelet"},
                {1,"hotel_de_ville"},
                {1,"saint_paul"},
                {1,"bastille"},
                {1,"gare_de_lyon"},
                {1,"reully_diderot"},
                {1,"nation"},
                {1,"porte_de_vincennes"},
                {1,"saint_mande"},
                {1,"berault"},
                {1,"chateau_de_vincennes"}
      };
     
      puts("\n--------------------------\n");
      puts("Verifier une station!\n");
      puts("Pour cela ecrivez le nom d'une station quelconque.\n");
     
      gets (strin);
     
      for (n=0; n<25; n++)
      {
        if (strcmp(strin, maListe[n].station)==0)
        {
          m=1;
          break;
        }
      }
     
      if (m) printf("%s existe.\n",strin);
      else   printf("%s n'existe pas.\n",strin);
     
      return 0;
    }
    gets() est dangereux, lui aussi. Quelqu'un indiquera la méthode adéquate.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    Par défaut
    Ouh le vilain paresseux
    gets() est dangereux, lui aussi. Quelqu'un indiquera la méthode adéquate.
    Il suffisait d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fgets(strin, sizeof(strin), stdin);
    {
      char *p;
      if ((p = strchr(strin, '\n')) != NULL)
        *p = 0;
      else
      {
         // buffer de saisie trop court
         // a voir ce qu'on veut faire
      }
    }
    En supposant que strin est un tableau de caractères et non un pointeur vers une chaîne de caractères.
    "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

  18. #18
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    lol Trap, en bon marseillais ça me fait toujours plaisir de donner un coup de main aux informaticiens de la RATP.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    Par défaut
    Reste Assis T'es Payé
    C'est ça
    "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

  20. #20
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Citation Envoyé par Trap D
    C'est ça
    Y'a ça aussi : Rentre Avec Tes Pieds

    A+

Discussions similaires

  1. [VBA]excel comparaison de chaine de caractere
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2006, 16h32
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 19h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 10h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 18h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 23h41

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