cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 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és178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 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
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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:
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):
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 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..
31 juil. 2007 à 16:39
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é.
31 juil. 2007 à 17:14
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;
}
31 juil. 2007 à 18:14
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.
31 juil. 2007 à 18:42
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
}
31 juil. 2007 à 19:00
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;
}