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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut Comparaison de chaines
    Bonjour,

    J'essaye d'écrire en C la fonction strstr en C, mais le problème quand j'exécute le programme il me renvoit meme les caractères qui ne sont pas identique avec le string que je compare avec
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /* Driver Function */ 
    char * StrStr(const char *string1, const char *string2) {  
        if (!*string2)
            return (char *)string1;
        if (!*string1) 
            return NULL;
        if ((*string1 == *string2) && (StrStr(string1+1, string2+1) == string1+1)) 
            return (char *)string1;
        return StrStr(string1+1  , string2);
    }
     
    /* Main Method */
    int main(int argc, char * argv[])
    {
     
        printf ("Returned String 1: %s\n", StrStr(argv[1], argv[2]));
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -SVF1521A7EB:~$ ./strs  kkabck abc
    Returned String 1: abck
    alors que moi je veux qui me renvois juste abc

    merci

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu envoies une chaîne terminée par un caractère nul à printf via %s, la fonction l'affiche. Pourquoi devrait-elle s'arrêter en cours de route ?

  3. #3
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    Citation Envoyé par l1informatique Voir le message
    J'essaye d'écrire en C la fonction strstr en C, mais le problème quand j'exécute le programme il me renvoit meme les caractères qui ne sont pas identique avec le string que je compare avec
    Ça tombe bien, c'est exactement ce que fait la fonction strstr de string.h
    Plus je connais de langages, plus j'aime le C.

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    Oui justement j'essaye de recoder la fonction strstr sans utiliser la lib
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    /* Driver Function */ 
     
    char *mystrstr(const char *str, const char *string2)
    {
        int   i = 0, j;
     
        if(!string2[0])     // Cas où les 2 chaînes sont vides.
            return (char*)&str[0];
        while (str[i])
        {
            j = 0;
            while(string2[j] == str[i+j] && string2[j])
                j++;
     
     
            if(!string2[j] && string2[j] != '\0')
     
                return (char*)&str[i];
                i++;
          }
     
        return NULL;
    }
     
    /* Main Method */
    int main(int argc, char * argv[])
    {
     
        printf ("Returned String 1: %s\n", mystrstr(argv[1], argv[2]));
     
    	return 0;
    }

    Je ne vois vraiment pas ou es le problème svp de l'aide

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    strstr ne retourne pas une string, mais la position dans la string.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    Citation Envoyé par l1informatique
    alors que moi je veux qui me renvois juste abc
    alors ce n'est pas le rôle de la fonction strstr(...) ! [man strstr] : The strstr() function finds the first occurrence of the substring needle in the string haystack. The terminating '\0' characters are not compared.

    Si tu compares ta fonction avec strstr(...) tu verras le même résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -SVF1521A7EB:~$ ./strs  kkabck abc
    Returned String 1: abck
    Comme l'a dit leternel : strstr ne retourne pas une string, mais la position dans la string (donc un pointeur).

    Sinon tu peux aussi utiliser les pointeurs pour ta fonction. 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
    char *my_strstr(const char *haystack, const char *needle)
    {
        // Tant que *haystack et *needle ne sont pas NULL (ou égale à 0)
        while(*haystack && *needle) {
            char *p = (char*)needle ;       // p pointe sur needle
            char *s = (char*)haystack ;     // s pointe sur haystack
     
            // Tant que *p est différent de 0 ET *p = *haystack
            while(*p && *p == *haystack) {
                p++ ;           // On passe au caractère suivant
                haystack++ ;    // Idêm
            }
     
            // Si *p est égale à 0, la chaine needle est dans la chaine haystack
            if(!*p) return s ;  // On retourne le pointeur s (début de chaine needle dans haystack)
     
            // Sinon on passe au caractère suivant
            haystack++ ;
        }
     
        return NULL ;
    }
    Bonne continuation
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par l1informatique Voir le message
    return (char*)&str[0]
    Bonjour
    return (char*)str (et encore, je ne suis pas certain que le cast soit nécesaire)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attention Elijha, non ta fonction est aussi peu const-correcte que celle de la bibliothèque standard, mais en plus tu perds la constance bien plus tôt que nécessaire: Le seul endroit où tu aurais besoin du cast, c'est if(!*p) return (char*)s ;.

    Mon conseil: Quitte à recoder la bibliothèque standard, autant éliminer certaines de ses lacunes. Donc je conseillerais ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char const * my_strstrC(char const *needlestack, char const *haystrand)
    {
    	/*Code de recherche avec que du const*/
    }
     
    char* my_strstrV(char* needlestack, char const*haystrand)
    {
    	/*On fait ça bien dans ce sens-là: Tous les calculs compliqués en const, et le cast seulement au résultat.*/
    	return (char*)my_strstrC(needlestack, haystrand);
    }

    Edit: Et si on veut être parano, on peut même faire ça sans cast:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char* my_strstrV(char* needlestack, char const*haystrand)
    {
    	char const* found = my_strstrC(needlestack, haystrand);
    	if(found != NULL)
    	{
    		assert(found >= needlestack);
    		size_t index = found - needlestack;
    		return needlestack + index;
    	}
    	else
    		return NULL;
    }
    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.

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    Je vous remercie tous pour vos réponses.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut comparaison de deux chaines de caractères sans tenir compte de la casse. En C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int compare(char S1[20], char S2[20])  
    { 
        int b;
        b=(strlen(S1)==strlen(S2));
        int i=0;
        while (b && i<strlen(S1))
        {
           b=(toupper(S1[i])==toupper(S2[i]));
           i++;
        }
        return b;
    }

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Oussama10 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int compare(char S1[20], char S2[20])  
    { 
        int b;
        b=(strlen(S1)==strlen(S2));
        int i=0;
        while (b && i<strlen(S1))
        {
           b=(toupper(S1[i])==toupper(S2[i]));
           i++;
        }
        return b;
    }
    Mouais... alors déjà le sujet n'étais pas de comparer deux chaines mais de rechercher la première dans la seconde.
    Sinon sans parler des deux strlen() initiaux totalement inutiles (chaque strlen() boucle sur sa chaine en intégralité donc avec deux chaines identiques, et si on compte la boucle while, les chaines sont traitées au final 3 fois !!!) c'est quand-même malheureux ce strlen() en plus dans la boucle !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int compare(char S1[], char S2[])  
    { 
        char *c1;
        char *c2; 
     
        for (c1=S1, c2=S2; *c1 || *c2; c1++, c2++)
           if (toupper(*c1) != toupper(*c2)) return 0;
        return 1;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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, 15h32
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 18h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 09h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 17h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41

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