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 :

Traitement sur chaîne [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Fabouney
    Invité(e)
    Par défaut Traitement sur chaîne
    bonjour à tous et à toute,

    voila je récupére dans une base de donnée une chaine de caractère.
    dans une variable qui est défini en taille fixe (3921 caractère).

    admettons la chaine que je récupére ce présente ainsi :

    À cinquante-neuf ans, Hannah Musgrave revient sur sa
    vie de jeune bourgeoise américaine privilégiée qui, dans les années 1960-1970, choisit de faire la "Révolution" avant d'aller vivre
    au Liberia. Le personnage d'Hannah constitue...
    j'aimerai remplacer dans cette chaine les " par "".

    mais je ne voit pas comment m'y prendre.
    faut-il utiliser un pointeur ?
    comment rajouter un caractère en plein milieu de la chaine ?
    merci de m'expliquer comment procéder.

    au revoir.

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Rajouter des caractères dans une chaîne n'est pas une chose évidente...

    Une solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Soit s la chaîne à modifier
    Soit t une chaîne vide
     
    Pour chaque lettre c de s
       Si c=='"' alors
           Ajouter à t la chaine "\"\""
       Sinon
          Ajouter à t le caractère c
       FinSi
    FinPour
    Copier dans s la chaîne obtenue t
    Biensûr ceci peut se généraliser avec la volonté de modifier "bon" en "mauvais" par exemple...

    Jc

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Traitement sur chaîne
    Citation Envoyé par Fabouney
    comment rajouter un caractère en plein milieu de la chaine ?
    On ne sait pas pas facilement insérer dans une chaine, et le langage C n'est probablement pas le plus adapté pour ça (voir les scripts avec sed etc.).

    Néanmoins, il y a des moyens.

    Si le tableau de char est suffisament grand, on peut y arriver à coup de strchr() (recherche) et memmove() (deplacement avant insersion) un peu lent, mais assez simple...

    Personellement j'utilise un objet 'maison' FSTR (Flexible STRing) qui me permet pas mal de manips 'souples' (pas besoin de gérer la taille, c'est automatique).

    Ca reste quand même assez gore...
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    static size_t count_patterns(char const *s_ori, char const *s_old)
    {
       size_t n = 0;
     
       char const *p_beg = s_ori;
       char const *p_end = s_ori;
     
       while (p_end != NULL)
       {
          p_end = strstr(p_beg, s_old);
          if (p_end != NULL)
          {
             n++;
             p_beg = p_end + 1;
          }
       }
       return n;
    }
     
    static char *str_replace_dyn (char const *s_ori, char const *s_old, char const *s_new)
    {
       char *s_mod = NULL;
       size_t n_patterns = count_patterns(s_ori, s_old);
     
       if (n_patterns != 0)
       {
          printf ("pattern '%s' found (%lu time(s))\n"
                  , s_old
                  , (unsigned long) n_patterns);
          {
             size_t size = strlen (s_ori)
                           + ((strlen (s_new) - strlen (s_old)) * n_patterns)
                           + 1;
             printf ("old size = %lu\n"
                     "new size = %lu\n"
                     , (unsigned long) strlen (s_ori) + 1
                     , (unsigned long) size
                    );
             s_mod = malloc (size);
             if (s_mod != NULL)
             {
                char const *p_beg = s_ori;
                char const *p_end = s_ori;
                *s_mod = 0;
                while (p_end != NULL)
                {
                   p_end = strstr(p_beg, s_old);
                   if (p_end != NULL)
                   {
                      strncat(s_mod, p_beg, (size_t) (p_end - p_beg));
                      strcat(s_mod, s_new);
                      p_beg = p_end + 1;
                   }
                   else
                   {
                      strcat(s_mod, p_beg);
                   }
                }
             }
          }
       }
       return s_mod;
    }
     
    int main(void)
    {
     
       char const *s = ("\"Hello\" \"world\"");
     
       printf ("'%s'\n", s);
     
       char *s_new = str_replace_dyn (s, "\"", "\"\"");
     
       if (s_new != NULL)
       {
          printf ("'%s'\n", s_new);
          free (s_new), s_new = NULL;
       }
     
       return 0;
    }
    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    '"Hello" "world"'
    pattern '"' found (4 time(s))
    old size = 16
    new size = 20
    '""Hello"" ""world""'
    Et hop, deux fonctions en bibliothèque...

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module STR

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Il te faut un buffer de taille (TA_LONGUEUR_MAX * 2) + 1 dans lequel tu recopie ta chaine d'origine caractere par caractere, sauf pour " où tu ajoute ce que tu veux

    Code improvisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    out_pos = 0;
    for (k = 0; (c = input[k]) != '\0'; k++)
    {
     if (c == '"')
     {
       output[out_pos++] = '"';
       output[out_pos++] = '"';
     }
     else
       output[out_pos++] = c;
    }
    /* a ne pas oublier : */
    output[out_pos++] = '\0';

Discussions similaires

  1. Traitement sur un selectedIndex inexistant ?
    Par 10-nice dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/08/2005, 10h33
  2. [C#] [.NET 1.1] [VSTUDIO 2003] Traitement sur les fontes
    Par stailer dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/08/2005, 19h53
  3. [VB.NET] Traitement sur chaine (simple)
    Par Tempotpo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 13h20
  4. [FLASH MX 2004] Traitements sur le resultat d'un AS.
    Par Med_Prog dans le forum Flash
    Réponses: 8
    Dernier message: 21/11/2004, 13h59

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