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 :

Redimensionner un tableau de char


Sujet :

C

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut Redimensionner un tableau de char
    Salut,

    Voici une fonction qui supprime tous les caractères indésirables dans une chaîne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     char * str_pack_char( char * z , short c )
     { char * s = z ;
       char * str = s  ; 
     
       while( *z )
       { if( *z != c ) *s++ = *z ;
         z++;
       }
       *s = '\0' ; 
       return str ; 
     }
    Une fois élaguée de ses caractères impures la chaîne ne peut que diminuer en espace mémoire. Faut-il pour autant répercuter cette diminution de l'espace mémoire dans la fonction de traitement ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    La chaîne diminue en longueur, mais le buffer qui la contient garde la même taille.

    Tu peux toujours retourner la nouvelle longueur si tu as absolument besoin de performances (si tu n'as pas le temps de la remesurer avec un strlen()), mais c'est généralement inutile.
    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.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Pourquoi "short" pour le caractère à éliminer ??

    le type naturel en C pour les caractères est "int" ...

    (voir par exemple getc etc.. (http://man.developpez.com/man3/fgets.3.php) )..

  4. #4
    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
    Citation Envoyé par dj.motte
    Voici une fonction qui supprime tous les caractères indésirables dans une chaîne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     char * str_pack_char( char * z , short c )
    Pourquoi short ? int fait parfaitement l'affaire et génère probablement moins de code inutile.

    C'est comme ça dans la bibliothèque standard (putchar(), strchr(), par exemple), et ce n'est certainement pas par hasard. Il n'y a aucun paramètre char ou short dans la bibliothèque standard.
    Une fois élaguée de ses caractères impures la chaîne ne peut que diminuer en espace mémoire. Faut-il pour autant répercuter cette diminution de l'espace mémoire dans la fonction de traitement ?
    Si c'est possible (mémoire allouée) c'est faisable avec realloc(), mais l'effet est probablement non mesurable si il s'agit de gagner quelques bytes. Par contre le temps de traitement induit est loin d'être négligeable. realloc() n'est à utiliser que dans les cas vitaux :
    • agrandir la mémoire si l'application le demande
    • la rétrécir (beaucoup) si la ressource est faible.

    Evidemment, ça n'a aucun sens sur de la mémoire statique ou automatique.

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

Discussions similaires

  1. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 22h40
  2. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  3. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  4. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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