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 :

Remplacer un mot dans une chaine de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut Remplacer un mot dans une chaine de caractères
    Salut
    Je voudrais savoir s'il existe une fonction qui permet de remplacer un mot par un autre dans une chaine de caracteres ?!
    C'est juste pour savoir car sinon, j'ai deja une solution de faite mais je me posait la question !!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 235
    Points : 134
    Points
    134
    Par défaut
    si tu veux parler d'une instruction toute faite comme strlen strcmp ... je ne pense pas ceci dit un compilateur particulier peut toujours proposer ce type de commande WHY NOT.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    oui, le plus simple est de la reprogrammer, ainsi tu peux toujours la modifier a souhait comme tu en as besoin, et l'avantage est que tu connais precisement son fonctionnement
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Le truc c'est que j'ai cru entendre une fois qu'il y avait une fonction qui permettait d'insérer dans une chaine une autre chaine a une position donnée !!
    Je me demandais si j'avai révé ou pas !!

  5. #5
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    N'existe pas dans le standard.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    la methode n'est pas dure, tu ecrit d'abord une fonction de cherche d'une chaine dans une autre, ensuite tu t'en sert pour trouver ton mot, et une fois que tu l'as tu tronc la chaine en 2 variables, chacune excluant le mot a remplacer, puis quand tu as tes deux variables + ton nouveau mot a inclure, tu concatene le tout et c'est regler

    ensuite si tu veux faire une fonction qui remplace tout les mots, bin tu re-itere l'operation jusqu'a ce que ton parsing de chaine est atteint sa fin
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  7. #7
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Code qui fonctionne à coup sûr (je l'utilise depuis plusieurs mois dans ma calto) :
    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
    59
    60
    61
    62
    63
    //-----------------------------------------------------------------------------
    // Remplace toutes les occurances de Avant par Apres dans la chaine txt, puis
    // renvoie un pointeur sur la nouvelle chaine créée. Renvoie NULL s'il txt
    // ne contient aucune occurance de Avant.
    char* str_replace (const char* txt, const char* Avant, const char* Apres)
    {
      const char* pos;           // Position d'une occurance de Avant dans txt
      char* TxtRetour;           // La chaine retournée
      size_t PosTxtRetour;       // Position du prochain caractère à écrire
                                 // dans TxtRetour
      size_t Long;               // Long d'une chaine à écrire dans TxtRetour
      size_t TailleAllouee;      // Taille allouée à TxtRetour
     
      // Cherche la première occurancce
      pos = strstr (txt,Avant);
     
      // Aucune occurance : renvoie simplement une copie de la chaine
      if (pos == NULL) return NULL;
     
      // Alloue une nouvelle chaine
      Long = (size_t)pos -(size_t)txt;
      TailleAllouee = Long +strlen(Apres)+1;
      TxtRetour = (char *)malloc(TailleAllouee);
      PosTxtRetour = 0;
     
      // Copie la première partie de la chaîne sans occurance
      strncpy (TxtRetour+PosTxtRetour,txt,Long); PosTxtRetour += Long;
      txt = pos+strlen(Avant);
     
      // Ajoute la chaîne de remplacement Apres
      Long = strlen(Apres);
      strncpy (TxtRetour+PosTxtRetour,Apres,Long); PosTxtRetour += Long;
     
      // Cherche la prochaine occurance
      pos = strstr (txt,Avant);
      while (pos != NULL)
      {
        // Agrandit la chaine
        Long = (size_t)pos -(size_t)txt;
        TailleAllouee += Long+strlen(Apres);
        TxtRetour = (char *)realloc(TxtRetour,TailleAllouee);
     
        // Copie ce qu'il y a entre la dernier occurance et la nouvelle
        strncpy (TxtRetour+PosTxtRetour,txt,Long); PosTxtRetour += Long;
     
        // Passe l'occurance
        txt = pos+strlen(Avant);
     
        // Ajoute la chaîne de remplacement
        Long = strlen(Apres);
        strncpy (TxtRetour+PosTxtRetour,Apres,Long); PosTxtRetour += Long;
     
        // Cherche la prochaine occurance
        pos = strstr (txt,Avant);
      }
     
      // Ajoute le reste de la chaîne (il reste au moins '\0')
      Long = strlen(txt)+1;
      TailleAllouee += Long;
      TxtRetour = (char*)realloc(TxtRetour,TailleAllouee);
      strncpy (TxtRetour+PosTxtRetour,txt,Long);
      return TxtRetour;
    }
    Ca renvoie une nouvelle chaîne, ou NULL si txt ne contient pas la sous-chaîne "Avant".

    C'est tirée de ma librairie (C++), donc y'a p'têtre qq. problèmes de compilation. Il est peut-être possible d'encore optimiser ça un poil, mais tant que ça marche ...

    @+ Haypo

  8. #8
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Long = (size_t)pos -(size_t)txt;
    Ce double cast est complètement inutile.

    Et euh... ta solution m'a l'air bien alambiquée.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    je dirais meme que ce double cast est assez dangereux... difference d'adresse, hummm... je sais pas, a chacun ca methode

    j'aurais bien poster le mien, mais... il n'est pas plus farfelue mais disont que j'utilise 2/3 fonctions que j'ai re-ecrite et que bcp trouverais inutile
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  10. #10
    Candidat au Club
    Homme Profil pro
    Programmeur en imagerie 3D et jeux-vidéo
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Programmeur en imagerie 3D et jeux-vidéo
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut str_replace solution !
    J'ai une solution qui marche que je viens de développer !!
    (Pensez à inclure string.h et stdlib.h)

    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* str_replace(char* str, char* pattern, char* sub)
    {
        char* buff = 0;
        buff = (char*)malloc(sizeof(char*)*255);
     
        while(*str != '\0')
        {
            if(*str == *pattern)
            {
                strcat(buff, sub);
            }
            else
            {
                strcat(buff, str);
            }
            *str++;
        }
        return buff;
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2009, 20h55
  2. [RegEx] trouver un mot dans une chaine de caractère
    Par starr dans le forum Langage
    Réponses: 2
    Dernier message: 22/06/2007, 15h36
  3. remplacer les cotes dans une chaine de caractère
    Par zut94 dans le forum Langage
    Réponses: 3
    Dernier message: 30/08/2006, 17h38
  4. recherche de mots dans une chaine de caractères
    Par jeanfrancois dans le forum Langage
    Réponses: 5
    Dernier message: 10/02/2006, 10h47

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