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 :

Retirer une chaine de caractère d'une autre


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Retirer une chaine de caractère d'une autre
    Bonsoir !

    Alors je cherche à retirer la première occurrence d'un motif dans une chaîne de caractère, par exemple :
    ie
    pierre

    doit donner prre

    Seulement avec ce code :

    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
     
    char* occ(char CH1[],char CH2[]){
    	int i=0;
    	int l=0;
    	int n=nbr_carac(CH1);
    	int m=nbr_carac(CH2);
    	for (int j=0;j<m;j++){
    		for (int k=0;k<n;k++){
    			if (CH2[j]==CH1[k]){
    				l++;
    			}
    			if (l==n){
    				CH2[j-1]=CH2[j+n-1];
    				break;
    			}
    		}
    	}
    	return CH2;
     
    }
    je récupère ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ie 
    pierre
    prre
    e
    D'où viens le e qui traîne derrière ? Et comment avoir le bon résultat ?

    Je cherche depuis plusieurs jours et je ne comprends vraiment pas où est on erreur

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Ton algo n'est vraiment pas terrible . Et en plus il fonctionne que la première fois parce que la variable l n'est jamais réinitialisée (exemple peut-être erroné : man et maman)
    Ton problème vient du fait que tu [ne recopies pas]/ [n'ajoutes pas] le caractère final '\0'.


    Code testé un chouïa, compilé :
    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
    char* occ(char CH1[],char CH2[]){
        int len_CH1, len_CH2;
     
        len_CH1 = nbr_carac(CH1);
        len_CH2 = nbr_carac(CH2);
     
        if ((len_CH1 > 0) && (len_CH2 > 0) && (len_CH2 >= len_CH1)) {
            int step_CH1, step_CH2;
            unsigned char is_not_found;
     
            is_not_found = 1; /* true */
     
            for (step_CH2=0; ((step_CH2 < len_CH2) && is_not_found); step_CH2++){
                for (step_CH1=0; ((step_CH1 < len_CH1) && (CH2[step_CH2 + step_CH1] == CH1[step_CH1])); step_CH1++) {}
     
                if (step_CH1 == len_CH1) { is_not_found = 0; }
            }
     
            if (!is_not_found) {
                --step_CH2; /* the loop for increments one more time */
     
                printf("occ - debug : [%d character%s ... pos : %d -> %d (len : %d)]\n", step_CH2, ((step_CH2 > 1)? "s": ""), (step_CH2 + len_CH1), len_CH2, (len_CH2 - (step_CH2 + len_CH1) + 1));
     
    /*          XXX careful : test if memcpy works with inplace copies */
                memcpy((CH2 + step_CH2), (CH2 + step_CH2 + len_CH1), (len_CH2 - (step_CH2 + len_CH1) + 1));
    /*          CH2[step_CH2 + len_CH1] = '\0'; */ /* maybe useless */
            }
        }
     
        return CH2;
    }

    Édit : mise à jour du code

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Pour savoir pourquoi tu affiches un e de trop, faudrait au moins voir le code de l'affichage.
    Sinon pour un tel algo, je m'attendrais à retrouver strcmp et strcpy/memmove.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    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
    J'ai vraiment parcouru ton code en diagonale mais il y a déjà un truc qui m'interpelle : l'algorithme en question fait a priori appel à la résolution de deux problèmes distincts, à savoir la recherche d'une sous-chaîne, puis la copie d'une chaîne. Or je ne visualise pas au sein de ta fonction ces deux portions logiques.


    Citation Envoyé par Bousk Voir le message
    Pour savoir pourquoi tu affiches un e de trop, faudrait au moins voir le code de l'affichage.
    Je suis d'accord, il manque des informations et notamment le code de la portée appelant la fonction présentée.


    Citation Envoyé par Bousk Voir le message
    Sinon pour un tel algo, je m'attendrais à retrouver strcmp et strcpy/memmove.
    Sans plus de détails sur l'énoncé j'imagine qu'on cherche à lui faire implémenter le truc from scratch.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par Chadoxis Voir le message
    D'où viens le e qui traîne derrière ?
    De ta chaine (effectivement il "traine" bel et bien) et il s'agit de celui-là: "pierre"...

    Citation Envoyé par Chadoxis Voir le message
    Et comment avoir le bon résultat ?
    Sais-tu comment est implémentée une chaine en C ? Parce que c'est ce que tu dois faire au final: t'assurer que ce que tu crées correspond aux conventions donc tu dois déjà les connaitre.

    Citation Envoyé par Chadoxis Voir le message
    Je cherche depuis plusieurs jours et je ne comprends vraiment pas où est on erreur
    "plusieurs jours" ? pourquoi pas plusieurs semaines tant que tu y es ? ou alors c'est ta "façon" de chercher qui est en cause. As-tu mis des "printf()" pour voir ce qui se passait ? as-tu testé avec une chaine ne contenant que des caractère différents (ex "bc" pour "abcdef") pour repérer le caractère qui revient ? as-tu fais un dessin avec des cases pour y mettre les caractères de ta chaine en y déroulant l'algo et en redessinant à chaque tour la nouvelle chaine en fonction de ce que ton algo fait ? chercher ce n'est pas lire et relire son programme en boucle en espérant que l'inspiration viendra toute seule. Ecrire un programme ce n'est pas comme écrire un roman...

    Citation Envoyé par foetus Voir le message
    exemple peut-être erroné : man et maman
    Oui, erroné car il n'y a qu'une seule fois "man" dans "maman" donc là encore son algo "devrait" marcher (mais on comprend ce que tu veux dire )
    Allez, un autre exemple : "ti" et "anticonstitutionnellement"
    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]

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui, erroné car il n'y a qu'une seule fois "man" dans "maman" donc là encore son algo "devrait" marcher (mais on comprend ce que tu veux dire )
    Non tu n'as pas compris : oui "man" se trouve bien 1 fois mais il va valider le motif presque en entier avec "mam" en premier lieu et ensuite trouver le motif "man".
    Ainsi, tu as fait tourner ton algo, le recharger et ensuite le relancer et tester le succès (<- il faut le recharger - relancer, c'est ce que je voulais dire)

    Parce que avec ton "ti" et "anticonstitutionnellement", tu as beau en avoir 3, 10, 100, X, il va s'arrêter au premier ... à la rigueur peut-être tester la copie avec une chaîne assez longue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/05/2017, 18h18
  2. Réponses: 2
    Dernier message: 31/01/2008, 17h58
  3. Réponses: 10
    Dernier message: 28/02/2007, 18h47
  4. JSP : comment remplacer une chaine de caractères par une autre
    Par techquos dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/12/2006, 09h37
  5. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51

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