Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LES CHAÎNES EN C, LTRIM, RTRIM, REPLACE ET REVERSE


Information sur la source

Catégorie :Tutoriaux Niveau : Débutant Date de création : 24/04/2004 Date de mise à jour : 25/04/2004 19:11:54 Vu / téléchargé: 3 869 / 172

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

Description

Quelques fonctions de manipulations de chaînes et une explication
(les commentaires sont dans le zip, je ne poste que le code).
Des exemples d'utilisation (le mai) est dans le zip.
Les premières fonctions sont fournies en standard en C.
J'ai les ai mises par ordre de difficulté (à mon avis, il faut les comprendre
dans l'ordre)
Voici mes choix d'implémentation (qui sont facilement modifiables selon
vos besoins ) :
1. les fonctions modifies la chaîne entrante
2. les trims acceptent une chaînes contenant les caractères à supprimer.
3. les trims auraient pu utiliser la fonction find, j'ai préféré une table locale.
(c'est discutable et j'ai hésité)


 

Source

  • int length( const char* s ) {
  • const char* org = s;
  • while( *s )
  • ++s;
  • return ( s - org );
  • }
  • const char* find( const char* str, char c ) {
  • while( *str ) {
  • if ( *str == c ) return str;
  • ++str;
  • }
  • return 0;
  • }
  • char* copy( char* dst, const char* src ) {
  • char* cur = dst;
  • while( *cur++ = *src++ )
  • ;
  • return dst;
  • }
  • char* rtrim( char* str, const char* t )
  • {
  • char* curEnd = str, *end = str;
  • char look[ 256 ] = { 1, 0 };
  • while( *t )
  • look[ (unsigned char)*t++ ] = 1;
  • while( *end ) {
  • if ( !look[ *end ] )
  • curEnd = end + 1;
  • ++end;
  • }
  • *curEnd = '\0';
  • return str;
  • }
  • char* ltrim( char* str, const char* t ) {
  • char* curStr = NULL;
  • char look[ 256 ] = { 1, 0 };
  • while( *t )
  • look[ (unsigned char)*t++ ] = 1;
  • curStr = str;
  • while( *curStr && look[ *curStr ] )
  • ++curStr;
  • return copy( str, curStr );
  • }
  • char* trim( char* str, const char* t ) {
  • return ltrim( rtrim( str, t ), t );
  • }
  • char* replace( char* str, const char* r, const char* b ) {
  • char* curDst = NULL;
  • char look[ 256 ] = { 0 };
  • while( *r && *b )
  • look[ (unsigned char)*r++ ] = *b++;
  • curDst = str;
  • while( *curDst ) {
  • char c = look[ *curDst ];
  • if ( c ) *curDst = c;
  • ++curDst;
  • }
  • return str;
  • }
  • char* reverse( char* str ) {
  • char* right = str, *left = NULL;
  • while( *right )
  • ++right;
  • left = str;
  • while( left < right ) {
  • char tmp = *left;
  • *left++ = *--right;
  • *right = tmp;
  • }
  • return str;
  • }
int length( const char* s ) {
    const char* org = s;
    while( *s )
        ++s;
    return ( s - org );
}

const char* find( const char* str, char c ) {
    while( *str ) {
        if ( *str == c ) return str;
        ++str;
    }
    return 0;
}

char* copy( char* dst, const char* src ) {
    char* cur = dst;
    while( *cur++ = *src++ )
        ;
    return dst;
}

char* rtrim( char* str, const char* t )
{
    char* curEnd = str, *end = str;

    char look[ 256 ] = {  1, 0 };
    while( *t )
       look[ (unsigned char)*t++ ] = 1;

    while( *end ) {
      if ( !look[ *end ] )
          curEnd = end + 1;
      ++end;
    }
    *curEnd = '\0';

    return str;
}

char* ltrim( char* str, const char* t ) {
    char* curStr = NULL;

    char look[ 256 ] = { 1, 0 };
    while( *t )
        look[ (unsigned char)*t++ ] = 1;

    curStr = str;
    while( *curStr && look[ *curStr ] )
        ++curStr;

    return copy( str, curStr );
}

char* trim( char* str, const char* t ) {
    return ltrim( rtrim( str, t ), t );
}

char* replace( char* str, const char* r, const char* b ) {
    char* curDst = NULL;

    char look[ 256 ] = { 0 };
    while( *r && *b )
        look[ (unsigned char)*r++ ] = *b++;

    curDst = str;
    while( *curDst ) {
        char c = look[ *curDst ];
        if ( c ) *curDst = c;
        ++curDst;
    }
    return str;
}

char* reverse( char* str ) {
    char* right = str, *left = NULL;
    while( *right )
        ++right;

    left = str;
    while(  left < right )  {
        char tmp = *left;
        *left++ = *--right;
        *right = tmp;
    }
    return str;
}

Conclusion

J'ai pas eu encore le courage de faire mon 3ième tuto sur les C++.
Comme j'ai rien trouvé de bien répondant à ces questions, je poste ça.
C'est court mais de toute façon, quand c'est long les gens ne lisent pas ;-)
le rtrim a été légèrement modifiée.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 25/04/2004 00:10:31 administrateur CS

Salut,

je te soumets une reflexion:
a quoi sert de retourner dans 'copy' par exemple le pointeur qu'on lui fournit , quel interet puisqu'on l'a deja ? Ne serait pas mieux de retourner pointeur sur FIN de copie afin d'eviter d'eventuels strcat. Le benef de performance dans du reporting (exemple) est considerable, les chaines ne sont parcourues qu'une seule fois. C'est pour ma part ce que j'ai toujours reproche a strcpy.
Qu'en penses-tu ?

BruNews

signaler à un administrateur
Commentaire de Hylvenir le 25/04/2004 20:50:12

Si on considére la chaîne C (char*) comme un objet, on peut considérer le strpcy, ou le strcat comme des fonctions membres, (au même titre que l'opérateur = ou += pour les std::string ).
Les concepteurs ont sûrement voulu faire en sorte qu'un utilisateur retrouvre sa chaîne d'origine en sortie afin de pouvoir utiliser cette chaîne. Comme ça "l'objet" chaîne ne varie pas du point de vue de l'utilisateur, on peut ainsi enchaîner des appels constructeurs/modifications sur le même objet chaîne.

Je n'ai jamais mesuré la pénalité du parcours en fin de chaine lors d'un strcat, comparé par exemple à simple formatage d'un entier dans une chaîne (assez fréquent ).
Dans le cas de concaténation successive, la gestion de la taille de la chaîne devrait poser plus de problème que la concaténation. A voir.
Mais pourquoi pas en effet voir ce que cela donne à l'usage d'avoir un retour sur fin de chaîne.

signaler à un administrateur
Commentaire de djl le 25/04/2004 23:28:06

juste pour le fun,

un strlen (length) ecrit dans le style k&r

strlen(s)
char s[];
{
    register i=0;
    while(*(++i+s)!=0);
    return i;
}

un  find

find(str,c)
char str[];
int c;
{
    register i;
    for(i=0; i[str]!=c; i++);
    return i;
}

un strcpy

char *strcpy(dest,src)
char dest[];
char src[];
{
    register i=0;
    while(dest[i++]=src[i]);
    return dest;
}

100% compatible c asni

signaler à un administrateur
Commentaire de Hylvenir le 26/04/2004 00:09:23

y'a pas a dire c'est moche le K&R ;-)

signaler à un administrateur
Commentaire de djl le 26/04/2004 00:22:42

oui, surtout pour les passage de parametre, et la regle du int par defaut n'aide pas a la lisibilite si on est pas habituer

qq truc aussi:

register i; = register int i; // int type par defaut

on passe int c au lieu de char c car les char sont promus en int lorsqu'ils sont passer en parametre (de meme pour les short, les float sont promus en double)

pas de const

signaler à un administrateur
Commentaire de NeoUmbrella le 09/06/2005 22:37:41

Dommage que ca ne marche pas véritablement comme la fonction en vb car on ne peut pas utiliser des constantes style reverse("test")

signaler à un administrateur
Commentaire de BruNews le 09/06/2005 22:44:10 administrateur CS

Ah mais non ce n'est pas dommage, c'est juste qu'en C on le code mais qu'en VB c'est caché dans une virtual machine. VB te ferait un SysAllocString et recopié "test" dedans avant d'y inverser les octets, voila ce que tu n'aurais pas vu mais aurait couté très cher en cycles processeur.

signaler à un administrateur
Commentaire de NeoUmbrella le 09/06/2005 23:40:44

Ha oais ok ^^, j'ai rien dit dans ce cas Hylvenir.

signaler à un administrateur
Commentaire de Hylvenir le 10/06/2005 00:01:51

:) No problemo.

Il faut juste savoir ce qu'il t'en coûte d'utiliser telle ou telle méthode. Elles ont toutes des avantages et des inconvénients. Il faut faire des choix.

signaler à un administrateur
Commentaire de sebastienmz le 08/11/2006 17:11:27

comment marche replace?

signaler à un administrateur
Commentaire de lillith212 le 23/05/2008 15:35:52 7/10

Merci pour ce code, Il m'a permit de comprendre certaines choses, cependant, ce que je regrette, c'est en tant que tr?s grande d?butante, je n'ai trouv? aucun commentaire...
Bonne continuation
Bonne prog

signaler à un administrateur
Commentaire de sheorogath le 23/05/2008 17:20:08 administrateur CS

strlen(s)
char s[];
{
    register i=0;
    while(*(++i+s)!=0);
    return i;
}

==> heuuuuu en lisant le code si ta chaine est egale a "" tu retournes 1
faudrais faire partir i a -1 non ? ou j'ai loupe un episode ?

signaler à un administrateur
Commentaire de BruNews le 24/05/2008 09:46:22 administrateur CS

DWORD bnstrlen(char *s)
{
  char *c = s;
  while(*c) c++;
  return (c - s);
}

signaler à un administrateur
Commentaire de Hylvenir le 24/05/2008 12:13:25

4 ans.. ça fait un bail...
Tiens, BruNews, avec le recul (4 ans), la première remarque sur le strcopy était intéressante puisque finalement, j'ai bien fini par ajouté une fonction appender qui renvoit la fin de la chaine. comme quoi.

DWORD... toujours sous windows donc. (size_t serait bien le bienvenue ici, de même qu'un const char*)

signaler à un administrateur
Commentaire de BruNews le 24/05/2008 13:37:59 administrateur CS

eh oui, je reste où sont les clients, faut bien payer les frais et le superflu.
C'est chouette quand il y a un rappel sur ces vieilles sources, un gout de nostalgie.
Bonne continuation.

signaler à un administrateur
Commentaire de sheorogath le 24/05/2008 14:15:05 administrateur CS

:d

puis bon pour toi etre sous linux correspond a etre communiste ^^

signaler à un administrateur
Commentaire de Hylvenir le 24/05/2008 15:14:18

De mon côté, je suis passé de hpux sous Linux, Windows et Sun.
alors je dois juste éviter les problèmes de portabilité.

Les clients, faut savoir les choisir ;)

Bonne continuation aussi.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.