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 :

comparer chaine de caractere sans strcmp


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Par défaut comparer chaine de caractere sans strcmp
    Boujour,
    Dans le code ci-dessu quanq je remplace strcmp(tmp->key, cle)!=0 par
    tmp-key!=cle je trouve pas les même resultat !!

    est ce qu'on toujours au niveau **Implementation**

    strcmp(chaine1,chaine2)==0 <=> chaine1==chaine2

    Merci par avance !!

    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
    typedef struct CELLULE {    //définition d'un liste chainee
    	char* key;	
    	int  data;
    	struct CELLULE* suivante;
    }CELLULE;
    typedef CELLULE* LCA;
     
     
    int recuperer(const LCA chaine , char* cle){
     
    	assert(est_utilise(chaine, cle)); //definie avant
    	LCA tmp = chaine;                      //pointeur temporelle pour iterer
    	while (strcmp(tmp->key, cle)!=0) {  
    		tmp=tmp->suivante;
    	}	
    	return tmp->data;

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par router_ Voir le message
    est ce qu'on toujours au niveau **Implementation**

    strcmp(chaine1,chaine2)==0 <=> chaine1==chaine2
    Non, ce n'est pas équivalent.

    strcmp va comparer ce qui est pointé par chaine1 et chaine2

    == va comparer la valeur chaine1 et la valeur chaine2.

    avec == si chaine1 et chaine2 ne sont pas au même endroit dans la mémoire vive, la comparaison renverra zéro.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Par défaut
    Merci mabu

    j'aimerais mieux assimiler :
    "avec == si chaine1 et chaine2 ne sont pas au même endroit dans la mémoire vive, la comparaison renverra zéro"

    si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
    char * message1="bonjour";
    char * message2="bonjour";
     
    printf("%d\n", message1==message2);
    }
    je trouve 1 , or message1 et message2 sont a deux endroit different de la RAM??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
    char* source="bonjour";
     
    char * message1=malloc(strlen(source+1)*sizeof(*message1));
    message1=source;
    char * message2=malloc(strlen(source+1)*sizeof(*message2));
    message2=source;
    printf("%d\n", message1==message2);
    }
    je retrouve le 1.

    Merci D'avance

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    je trouve 1 , or message1 et message2 sont a deux endroit different de la RAM??
    Comme les deux chaines sont identiques, le compilateur utilise la même. Donc, même adresse.
    Si tu en modifies une, les deux adresses seront différentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * message1=malloc(strlen(source+1)*sizeof(*message1));
    message1=source;
    char * message2=malloc(strlen(source+1)*sizeof(*message2));
    message2=source;
    printf("%d\n", message1==message2);
    Je ne comprends pas l'intérêt d'un tel code. Tu écrases la valeur des deux pointeurs (message1 et message2) par la même valeur (l'adresse du premier élément de la chaine de caractère). Non seulement, cela n'a aucun intérêt mais en plus tu provoques deux fuites de mémoires.
    La comparaison effectuée sur les deux pointeurs renvoie forcément 1 car leur adresse est identique après que tu aies écrasé leur valeur respective.

    En C, le '=' ne sert pas à copier une chaine dans une autre.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Par défaut
    Salut

    avec ce nouveau code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main() {
    char* source1=malloc(8);
    strcpy(source1,"bonjour");
     
    char* source2="bonjour";
     
     
    char * message1=malloc(strlen(source1+1)*sizeof(*message1));
    message1=source1;
    char * message2=malloc(strlen(source2+1)*sizeof(*message2));
    message2=source2;
     
    printf("%d\n", message1==message2);
    CA RETOURNE 0 , je commence à comprendre!! donc les deux exemple cité auparavant pointait vers la même zone de mémoire !!!!!!!

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Par défaut
    Merci iifiniment jeroman

    J'ai bien compris l'erreur commise !!!

    Bon journée

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par router_ Voir le message
    Salut

    avec ce nouveau code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main() {
    char* source1=malloc(8);
    strcpy(source1,"bonjour");
     
    char* source2="bonjour";
     
    char * message1=malloc(strlen(source1+1)*sizeof(*message1));
    message1=source1;
    char * message2=malloc(strlen(source2+1)*sizeof(*message2));
    message2=source2;
     
    printf("%d\n", message1==message2);
    CA RETOURNE 0 , je commence à comprendre!! donc les deux exemple cité auparavant pointait vers la même zone de mémoire !!!!!!!
    Ici, tu compare encore la valeur de source1 avec celle de source2.

    Tu peux ajouter quelques traces pour mieux voir ce qui se passe :

    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
    int main() {
    char* source1=malloc(8);
    strcpy(source1,"bonjour");
     
    char* source2="bonjour";
     
    printf("source1: %p\n", source1);
    printf("source2: %p\n", source2);
     
    char * message1=malloc(strlen(source1+1)*sizeof(*message1));
    printf("message1 : %p\n", message1);
     
    message1=source1;
    printf("message1 : %p\n", message1);
     
    char * message2=malloc(strlen(source2+1)*sizeof(*message2));
    printf("message2 : %p\n", message2);
     
    message2=source2;
    printf("message2 : %p\n", message2);
     
     
    printf("%d\n", message1==message2);
    Autre chose :
    Tu voulais écrire strlen(source1) + 1 je pense.

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Par défaut
    salut mabu

    oui je désignais strln()+1, j'ai compris la source d'erreur. Merci infiniment!!

  9. #9
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Comme les deux chaines sont identiques, le compilateur utilise la même. Donc, même adresse.
    Si tu en modifies une, les deux adresses seront différentes.
    C'est surtout que si tu modifies une des deux valeurs, tu segfault
    En effet, tu déclares un pointeur pour lui donner comme adresse "Bonjour"
    Le compilateur est assez intelligent pour dire que tu veux que ta variable pointe sur l'adresse contenant le texte "Bonjour", il va donc placer Bonjour dans un .text et attribuer a ta variable l'adresse du .text
    Le texte est donc statique, (et non dynamique).
    Si tu tentes de modifier l'adresse de ta variable par contre, aucun soucis évidement

    Voici une source d'exemple:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
      char  *message1 = "bonjour";
      char  *message2 =  "bonjour";
      char  *toto;
     
      /* message1[0] = 'r' => ca segfaultera, on est dans du statique ici !*/
      printf("Message 1 = %s (%p)\n", message1, message1);
      printf("Message 2 = %s (%p)\n", message2, message2);
      printf("toto (%p)\n", toto);
      printf("\n");
      toto = malloc(sizeof(char) * 6);
      if (toto == NULL)
        return (EXIT_FAILURE);
      toto[0] = 'H';
      toto[1] = 'E';
      toto[2] = 'L';
      toto[3] = 'L';
      toto[4] = 'O';
      toto[5] = 0;
      message2 = toto;
      printf("Message 1 = %s (%p)\n", message1, message1);
      printf("Message 2 = %s (%p)\n", message2, message2);
      printf("toto = %s (%p)\n", toto, toto);
      return (EXIT_SUCCESS);
    }
    A l'execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    6:37 sloshy@clonix-rack /tmp% gcc -W -Wall -ansi -pedantic toto.c -o jeroman
    toto.c: In function ‘main’:
    toto.c:22: warning: ‘toto’ is used uninitialized in this function
    6:37 sloshy@clonix-rack /tmp% ./jeroman                                     
    Message 1 = bonjour (0x8048650)
    Message 2 = bonjour (0x8048650)
    toto (0x65bd20)
     
    Message 1 = bonjour (0x8048650)
    Message 2 = HELLO (0x9be1008)
    toto = HELLO (0x9be1008)
    6:37 sloshy@clonix-rack /tmp%

  10. #10
    Membre confirmé Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    Attention aussi au gros memory leak que t'a signalé jeroman ici (au delà de l'erreur sur le strlen):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *source = "message";
    char * message1=malloc( strlen(source+1) * sizeof(*message1));
    message1=source; // beark
    char * message2=malloc( strlen(source+1) * sizeof(*message2) );
    message2=source; // beark
    Les deux malloc que tu fais sont perdus quand tu fais Un correctif:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *source = "message";
    char * message1=malloc( (strlen(source) + 1 ) * sizeof(*message1));
    strcpy(message1,source); // copie "message" dans le buffer alloué par malloc
    char * message1=malloc( (strlen(source) + 1 ) * sizeof(*message2));
    strcpy(message2,source);
     
    // du code ici
     
    // libère la mémoire demandée par les malloc
    free(message1);
    free(message2);

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 09/12/2008, 08h43
  2. test qui compare un champs et une chaine de caractere
    Par goomie dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/10/2007, 01h42
  3. [VBA/EXCEL]comparaison de chaine de caractere avec ou sans espace
    Par rodrigue62 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/07/2007, 10h48
  4. comparer une valeur de formulaire et une chaine de caractere.
    Par minirom dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/08/2006, 10h53
  5. Réponses: 2
    Dernier message: 04/11/2005, 11h35

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