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 deux chaines de caractères


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 22
    Points
    22
    Par défaut Comparer deux chaines de caractères
    Bonsoir à tous
    J'ai un problème sur une question : je dois en fait comparer deux chaines de caractères sans utiliser la fonction de string.h et en ne prenant pas en compte les casses de caractère.

    J'ai donc créer ce sous programme en C :
    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
    int comparaison(const char * chaine1,const char * chaine2)
    {
    	int i;
    	i=0;
    	int j ;
    	j=0;
    	int celuiQuiVrai;
    	int cpt1 = 0;
    	int cpt2 = 0;
    	while((chaine1[i]!='\0') && (chaine2[j]!='\0'))
    	{
    		if((chaine1[i]==chaine2[j]))
    		{
    			cpt1++;
                            cpt2++;
    			i++;
    			j++;
    		}
    		if(chaine1[i]>chaine2[j])
    		{
    			cpt2++;
    			i++;
    			j++;
    		}
    		if((chaine1[i]!='\0') && (chaine2[j]=='\0'))
    		{
    			cpt1++;
    			i++;
    		}
    		if((chaine1[i]=='\0') && (chaine2[j]!='\0'))
    		{
    			cpt2++;
    			j++;
    		}
    	}
    	celuiQuiVrai=-1;// si il retourne - 1 alors la chaine1 est plus grande que la chaine2
    	if(cpt1>cpt2)
    	{
    		 celuiQuiVrai=1;
    	}
    	if(cpt1==cpt2)
    	{
    		 celuiQuiVrai=0;
    	}
    	return celuiQuiVrai;
    }
    et dans le programme principal :

    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
    	//Comparaison de deux chaines
     
    	vrai=comparaison(chaine1,chaine2);
    	printf("\n%d",vrai);
    	if( vrai == 0)
    	{
    		printf("\n%s et %s sont identiques\n",chaine1,chaine2);
    	}
    	if(( vrai!=0 && vrai!=1))
    	{
    		printf("\n%s est inferieur a %s \n",chaine1,chaine2);
    	}
    	if( vrai == 1)
    	{
    		printf("\n%s est superieur a %s\n",chaine1,chaine2);
    	}
    	printf("\n____________FIN\n");
    les allocations des chaines ont bien été faite avant avec la saisie puisque j'ai tester, en tout cas le sous programme ne marche pas du tout et je ne comprend pas pourquoi ? je ne sais pas si ça vient du fait qu'on est deux valeur pointé en paramètre...
    Je vous remercie d'avance

    Cordialement

  2. #2
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,
    tu peux aller faire un tour sur la FAQ http://c.developpez.com/faq/?page=st...STRINGS_strcmp

    Tu y verras qu'il te faut utiliser la fonction strcmp.
    Je te laisse regarer la FAQ pour voir son utilisation.

    Cordialement,
    Christophe
    Cordialement,
    Christophe

    Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    justement je ne dois pas l'utiliser, je dois moi même le coder en fait

  4. #4
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    BOnjour,

    Excuses moi j'avais mal lu, le problème est sur chaque partie de ta boucle.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if((chaine1[i]==chaine2[j]))
    		{
    			cpt1++;
    			i++;
    			j++;
    		}
    A quoi corresponde exactement chacun des compteurs?
    Moi je ne ferai qu'un seul if

    Le principe de la comparaison de chaines est
    Tant que j'ai le même caractère dans les deux chaines, j'avance au caractère suivant pour les deux chaines (jusqu'à fin d'au moins une des deux chaines)
    Carch1<carch2 stop cpt2++;
    Carch1>carch2 stop cpt1++;
    FIn de boucle
    Comparaison des compteurs
    Si cpt2>cpt1
    Si cpt2<cpt1
    Si cpt2=cpt1
    Gestion lorsque le caractère de fin de chaine a été trouvé

    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
     
    while((chaine1[i]!='\0') && (chaine2[i]!='\0'))
    {
    if(chaine1[i]>chaine2[i])  //Chaine1 plus grande que chaine2
    		{
    			cpt1++; //Incrémenter cpt1++
                            break;
    		}
    else 
    {
    if(chaine1[i]<chaine2[i])  // Chaine2 plus grande que chaine1
    		{
    			cpt2++; // Incrémenter chaine1
                            break;
    		}
    }
    i++; //Incrémenter parcours des chaines
    j++;
    }
    D'ailleurs un seul indice de parcours suffit puisque tu arriveras forcément au même nombre de caractères si identique. Il te reste encore à gérer le cas d'une chaîne plus courte (A tester à la fin du code si les deux compteurs ont la même valeur, regarder quelle chaîne à le caractère de fin de chaîne et vérifier le cas où les deux l'ont).

    Cordialement,
    Christophe
    Cordialement,
    Christophe

    Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Bonjour Christophe
    En fait c'est exactement dans la même idée !
    le compteur 1 s'incrémente si le caractère de la chaine 1 et plus grande que le caractère de la chaine 2, le compteur 2 s'incrémente si le caractère de la chaine 2 est plus grande que le caractère de la chaine 1, sinon les deux compteurs s'incrémentent quand le caractère de la chaine 1 est égal au caractère de la chaine 2, ensuite dans mon code j'ai si la chaine 1 a atteint \0 et que la chaine 2 ne l'a pas atteint, j'incrémente le compteur2 et si l'inverse j'incremente le compteur 1, je sors de mon hile, et je compare les compteurs pour attribuer la valeur de mon booléen !
    Est ce que le principe est bon là aussi ? en tout cas compilant il ne s'éxecute pas

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Salut.

    Citation Envoyé par SmithC Voir le message
    J'ai un problème sur une question : je dois en fait comparer deux chaines de caractères sans utiliser la fonction de string.h et en ne prenant pas en compte les casses de caractère.
    Ne pas utiliser les fonctions de string.h ne t'empêchent pas d'étudier leur comportement (voir FAQ) et de les "recréer". Si tu n'a pas le droits aux fonctions de string.h, j'imagine que tu n'a pas le droit d'utiliser strlen () pour connaître la taille d'une chaîne (nombre de caractères).

    Il te faut donc recréer une fonction strlen () puis une fonction strcmp () (strlen() pourrait t'être utile pour créer strcmp()) qui ne tienne pas compte de la casse. Pour ce problème de casse, voici un moyen très simple : tu créer une fonction maj () qui te renvoie une chaîne dont les caractère minuscules sont mis en majuscule, en retirant 32 de la valeur décimale du code ASCII des caractères minuscules (compris entre 92 et 122). La fonction strcmp () devra renvoyer 0 si les deux chaînes sont identiques ou 1 dans le cas contraire.

    Ce code pourra t'aider à comprendre si tu ne trouves pas :

    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
    # include <stdio.h>
     
    int my_strlen (char*);
    char* maj (char*);
    int my_strcmp (char*, char*);
     
    int main (void)
    {
        char str1[10], str2[10];
        printf ("Saisir str1 : ");
        scanf ("%s", str1);
        printf ("Saisir str2 : ");
        scanf ("%s", str2);
        if (my_strcmp(str1,str2) == 0)
            printf ("str1 et str2 sont identiques\n");
        else
            printf ("str1 et str2 sont differentes\n");
        return 0;
    }
     
    /* Cette fonction renvoie la taille d'une chaîne mise en paramètre */
    int my_strlen (char str[])
    {
        int size_str = 0;
        for (size_str=0 ; str[size_str]!='\0' ; size_str++);
        return size_str;
    }
     
    /* Cette fonction met tout les termes en micuscule d'une chaîne mise en paramètre, en majuscule */
    char* maj (char str[])
    {
        int i;
        for (i=0 ; i<my_strlen(str) ; i++)
        {
            if (str[i] >= 97 && str[i] <= 122) /* Si le carractère est compris entre 92 et 122 */
                str[i] -= 32; /* On retire 32 */
        }
        return str;
    }
     
    /* Cette fonction compare 2 chaînes sans tenir compte de la casse et renvoie 0 si elles sont identiques ou 1 si elles sont différentes */
    int my_strcmp (char str1[], char str2[])
    {
        int i=0, result=0;
        str1 = maj(str1); /* On met en majuscule */
        str2 = maj(str2); /* On met en majuscule */
        if (my_strlen(str1) != my_strlen(str2))
            return 1;
        else
        {
            for (i=0 ; i<my_strlen(str1) && result!=1 ; i++)
            {
                if (str1[i] != str2[i])
                    result=1;
            }
            return result;
        }
    }
    Cordialement,
    Idriss

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Je te remercie Idriss j'avais déjà établi les sous programmes pour mon strlen, et majuscule, mais c'est vrai que je n'avais pas exactement eu l'idée de comparer les longueurs de chaines, et donc j'ai incrémenter deux compteurs différents que je compares, mais est ce que c'est normal que mon sous programme celui du première article ne marche pas du tout je suis assez curieux de savoir

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Tu veut comparer la taille des chaînes ou bien leur contenu pour savoir si elles sont identiques ou pas ? Parce qu'à la fois tu parles de les comparer sans tenir compte de la casse (autrement dit tu veut comparer leur contenu) et à la fois, ton code, sans vérifier s'il fonctionne, ne semble (à première vue) s'intéresser qu'aux tailles des chaînes (sans être très optimisé avec toutes ces incrémentations, etc). Si tu ne t'intéresses aussi à la tailles des chaînes, il suffit de comparer my_strlen(chaîne1) à my_strlen(chaîne2) dans ton main, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (my_strlen(str1) > my_strlen(str2))
        printf ("str1 plus grand que str2\n");
    else if (my_strlen(str1) < my_strlen(str2))
        printf ("str1 plus petit que str2\n");
    else
        printf ("str1 meme taille que str2\n");

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

Discussions similaires

  1. Comparer deux chaines de caractères
    Par xenos dans le forum Delphi
    Réponses: 5
    Dernier message: 18/06/2007, 12h01
  2. Comparer deux chaines de caractères
    Par helww dans le forum C++
    Réponses: 10
    Dernier message: 24/04/2007, 12h26
  3. Réponses: 4
    Dernier message: 08/09/2006, 10h41
  4. Comparer deux chaines de caractères dans un if ?
    Par Xplosif² dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2006, 20h21
  5. comparer deux chaines de caractères
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 15h31

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