ENCORE UN TRIM()

cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 - 31 juil. 2007 à 16:39
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 31 juil. 2007 à 23:44
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43621-encore-un-trim

cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
31 juil. 2007 à 16:39
Cette implémentation est dangeureuse car si ton pointeur avait alloué par un malloc, pour le free c'est foutu, puisque ton pointeur ne point plus sur la même adresse après l'appel.

un trim consiste en un trim gauche et un trim droite. A droite c'est simple, mais à gauche il ne faut pas se contenter de déplacer le pointeur il faut décaler les valeurs afin de garder la même adresse de départ.

Pour une implémentation robuste, toujours retourner le pointeur passé en paramètre car tu n'a aucune idée de la manière dont il a été alloué.
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
31 juil. 2007 à 17:14
Bon, pour la forme afin de faire un peu tiedir le café, voici un trim fait à la à volée pour expliciter mon propos.
le code est ecrit à l 'arrache (le café froid, c'est pas bon) et sans aucune contrôle mais il trimme bien avec décalage vers la gauche


#define trim(s) trimc(s, ' ')
#define rtrim(s) rtrimc(s, ' ')
#define ltrim(s) ltrimc(s, ' ')

char* trimc(char* s, char t)
{
rtrimc(s, t);
ltrimc(s, t);

return s;
}

char* rtrimc(char* str, char t)
{
char *s = str;

while (*s)
if (*s++==t)
{
*--s=0;
break;
}

return str;
}


char* ltrimc(char* str, char t)
{
if (*str == t)
{
char *s1=str, *s2=str;

while (*s2 == t) s2++;
while (*s2) *s1++ = *s2++;

*s1 = 0;
}

return str;
}
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
31 juil. 2007 à 18:14
Salut vicenzo.
Hmmm, ton rtrimc n'est pas bon. Il remplace tout les espaces par des 0 à partir du début de la chaine. Utilisé après un ltrimc, on ne verra pas la différence mais si on l'utilise seul, adieu la chaine.
Ceci est fonctionnel:

char* rtrimc(char *str, char t)
{
while(*str) str++;
while (*--str == t);
*++str = 0;

return str; // Retour sur 0 de fin de chaine
}

Par la même occation, ton trim se trouve à parcourir 2 fois la chaine. 1 pour les ltrimc est 1 autre fois pour le rtrimc.
Ce trimc est fonctionnel (pas testé en profondeur):

char* trimc(char *str, char t)
{
char *c = str;

while(*str == t) str++;
while(*str) *c++ = *str++;
while (*--c == t);
*++c = 0;

return c; // Retour sur 0 de fin de chaine
}

J'espère que j'ai pas fais trop d'erreurs, car comme de disais, je n'est pas eu le temps de tout tester minutieusement.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
31 juil. 2007 à 18:42
Voici quelque chose de mieux je pense:

char* trimc(char *str, char t)
{
char *c str, *d str;

while(*str == t) str++;
while(*str) {
*c = *str++;
if(*c++ !t) d c;
}
*d = 0;

return d; // Retour sur 0 de fin de chaine
}

char* rtrimc(char *str, char t)
{
char *c = str;
while(*str) if(*str++ !t) c str;
*c = 0;

return c; // Retour sur 0 de fin de chaine
}
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
31 juil. 2007 à 19:00
Salut SAKindom,

pour le rtrim, ok le café avait déja perdu 1°C - j'étais pressé de le déguster.

on trimmme à gauche, à droite, ou des deux, j'avais donc deux primitives rassemblées pour en faire un troisieme..
Effectivement cela toujours plus optimisé sans les deux sous appels

Sinon la valeur de retour n'est pas bonne car tu utilise c dans le code est donc tu ne retournes pas la valeur de départ..

Au final voila le code pour DarkPoulpos :

char* trimc(char *str, char t)
{
char *s1=str, *s2=str;

while(*s2 == t) s2++;
while(*s2) *s1++ = *s2++;
while (*--s1 == t);
*++s1 = 0;

return str;
}
Rejoignez-nous