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 :

Problème lorsque je compare deux cellules d'un tableau avec strcmp


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Problème lorsque je compare deux cellules d'un tableau avec strcmp
    Bonjour tout le monde,

    J'utilise strcmp pour comparer deux cellules d'un tableau (pour voir si leur valeur est la même).

    Pour cela, j'ai deux variables (indice et indice2).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comparaison = strcmp(mot[indice],mot[indice2]);
    indice vaut 0 et indice2 vaut la longueur du mot - 1.

    Est-il possible de faire une comparaison de cette façon car j'obtiens un message d'erreur qui est le suivant :

    error C2664: 'strcmp' : cannot convert parameter 1 from 'char' to 'const char *'
    Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    Je vous remercie d'avance pour votre aide et je vous souhaîte un bon Dimache.

    beegees

  2. #2
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    strcmp compare deux chaînes terminées par un zéro final (caractère participant à la comparaison), le mieux pour toi si tu veux comparer autre chose que des chaînes complètes serait plutôt d'utiliser memcmp à la place (ou éventuellement strncmp).

    Ce que tu fait dans ton cas, c'est donner un simple type char car tu spécifie un indice d'un char dans ton mot !

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    strcmp compare deux chaînes terminées par un zéro final (caractère participant à la comparaison), le mieux pour toi si tu veux comparer autre chose que des chaînes complètes serait plutôt d'utiliser memcmp à la place (ou éventuellement strncmp).

    Ce que tu fait dans ton cas, c'est donner un simple type char car tu spécifie un indice d'un char dans ton mot !
    Bonjour Franck,

    Merci pour votre réponse.

    Je comprends mieux maintenant pourquoi j'avais toujours ce message d'erreur quand j'essayais de comparer deux chaînes ne se terminant pas par un '\0'.

    Pour ce qui est du memcmp, si j'ai bien compris, il faut 3 paramètres pour cette fonction.

    Les deux éléments à comparer et le nombre de caractère qui doit être comparé ? juste ?

    Quand je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comparaison = memcmp(mot[indice],mot[indice2],1);
    j'obtiens ce message d'erreur :

    error C2664: 'memcmp' : cannot convert parameter 1 from 'char' to 'const void *'
    Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    J'édite à partir di'ici :

    Je vous que vous avez édité votre message, je serais plus intéressé d'utiliser strncmp car nous l'avons appris à l'école mais problème identique au memcmp :
    strncmp' : cannot convert parameter 1 from 'char' to 'const char *'
    Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	comparaison = strncmp(mot[indice],mot[indice2],1);
    Qu'en pensez-vous ?

    Merci encore.

    beegees

  4. #4
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par beegees Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	comparaison = strncmp(mot[indice],mot[indice2],1);
    Qu'en pensez-vous ?
    J'en pense que c'est faux tout simplement, du moins si mot est un tableau de char et non un tableau de tableau sur char ! Quand on compare des chaînes, ce sont deux chaînes à deux emplacements mémoire différents ce qui ne me semble pas être le cas ici donc l'utilisation d'une fonction de comparaison n'a pas lieu d'être utilisée ici !

    Si c'est pour simplement comparer deux char d'une chaîne entre eux, un simple test suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (mot[indice] != mot[indice2])
    {
       ...
    }
    Ou un test d'égalité, tout dépend de ce qu'il te faut

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Re,

    si mot est un tableau de char
    En effet, c'est un tableau de char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    et non un tableau de tableau sur char !
    Vous parlez d'une tableau à plusieurs dimensions ?

    Quand on compare des chaînes, ce sont deux chaînes à deux emplacements mémoire différents
    Dans tous les cas alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ce qui ne me semble pas être le cas ici
    en effet

    Si c'est pour simplement comparer deux char d'une chaîne entre eux, un simple test suffit:

    Code :
    if (mot[indice] != mot[indice2])
    {
    ...
    }
    C'est ce que j'ai en effet fait car la fonction de comparaison ne fonctionnait pas.

    Je voudrais néanmoins ajouter queluqe chose, j'ai initialisé deux nouvelles variables (val1 et val2), j'ai affecté la valeur de mot[0] à val1 et mot[0] à val2 (ce qui devrait retourner 0 à la fonction strcmp car c'est égal), j'ai fait strcmp(val1,val2) pour faire un test, j'obtiens toujours le message d'erreur qui est :

    error C2664: 'strcmp' : cannot convert parameter 1 from 'char' to 'const char *'
    Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

    Voici le code entier de ma fonction, ça sera peut être plus facile : (c'est une fonction retapée, adaptée pour vous montrer que comparer deux éléments dans deux adresses différentes plante chez moi)

    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
    void EstUnPalindrome(char* mot, const Taille_Maximale)
    {
    	int Taille_Mot = 0;
    	int i=0;
    	Taille_Mot = strlen(mot);
    	int indice = 0; int indice2 = (Taille_Mot-1);
    	int comparaison = 0;
    	char val1 = mot[indice];
    	char val2 = mot[indice];
     
     
    	printf("indice2 vaut %ld",indice2);
     
     
     
    	printf("la taille du mot est %ld\n",Taille_Mot);
     
    	comparaison = strcmp(val1,val2);
     
     
     
    }
    Qu'en pensez-vous ?

    Merci pour votre dévouement.

    beegees

  6. #6
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par beegees Voir le message
    Voici le code entier de ma fonction, ça sera peut être plus facile : (c'est une fonction retapée, adaptée pour vous montrer que comparer deux éléments dans deux adresses différentes plante chez moi)

    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
    void EstUnPalindrome(char* mot, const Taille_Maximale)
    {
    	int Taille_Mot = 0;
    	int i=0;
    	Taille_Mot = strlen(mot);
    	int indice = 0; int indice2 = (Taille_Mot-1);
    	int comparaison = 0;
    	char val1 = mot[indice];
    	char val2 = mot[indice];
     
     
    	printf("indice2 vaut %ld",indice2);
     
     
     
    	printf("la taille du mot est %ld\n",Taille_Mot);
     
    	comparaison = strcmp(val1,val2);
     
     
     
    }
    Qu'en pensez-vous ?
    J'en pense que tu n'as pas compris ce que j'ai dit. J'ai explicitement dit que la fonction strcmp compare deux chaînes or ici tu ne fait que comparer deux char alors que la fonction attend comme type des chaînes soit char* !

    Comparer deux char reviens simplement à comparer deux entiers, ni plus ni moins donc une condition de test comme celle que je t'ai montré plus haut est la voie à suivre !

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Re,

    J'ai bien compris maintenant, ça vallait bien la peine de perdre son Dimanche là dessus

    à partir de maintenant, je compare deux caractères avec == et des chaînes avec strcmp.

    Un super grand merci pour votre patience.

    beegeees

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

Discussions similaires

  1. créer une macro pour comparer deux cellules d'une même colonne
    Par barbie-9 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/05/2012, 20h28
  2. comparer deux cellules de deux fichiers différents
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/07/2008, 12h13
  3. Comparer deux cellules, si pas trouvé résultat sur Feuille 3
    Par MartinezGarcia dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/02/2008, 15h34
  4. [Formules..]Comment comparer deux cellules ?
    Par Trooper2 dans le forum Excel
    Réponses: 2
    Dernier message: 30/04/2007, 14h59
  5. Réponses: 9
    Dernier message: 27/06/2006, 17h55

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