Les chaines de caract�res en C
http://nicolasj.developpez.com/articles/libc/string/
Citation:
Apr�s un rappel sur la structure des chaines de caract�res en C et un aper�u des fonctions de la biblioth�que standard servant � manipuler ces chaines, je vous propose de cr�er notre propre biblioth�que de manipulation des chaines de caract�res.
Vous pouvez laisser un commentaire sur cet article � la suite.
des mallocs � l'int�rieur d'une fonction : est-ce bien raisonnable ?
Bonjour,
Je passais par ici par hasard. Je vois bien que l'exemple date un peu...
Une remarque sur les exemples de code donn�s, comme par exemple celui-ci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| char *str_tolower (const char *ct)
{
char *s = NULL;
if (ct != NULL)
{
int i;
s = malloc (sizeof (*s) * (strlen (ct) + 1));
if (s != NULL)
{
for (i = 0; ct[i]; i++)
{
s[i] = tolower (ct[i]);
}
s[i] = '\0';
}
}
return s;
} |
Je crois que c'est une mauvaise id�e de montrer � des d�butants des exemples de fonctions structur�es comme celle-ci. Une fonction est responsable de l'utilisation qu'elle fait de la m�moire. Donc si une fonction alloue de la m�mooire avec un malloc, elle doit la lib�rer avec un free abant de sortir.
En cons�quence, une fonction comme celle-ci ne peut pas renvoyer son r�sultat sous forme d'une chaine de caract�re qu'elle a allou�e sur le tas. C'est une mauvaise pratique. La responsabilit� d'allouer de la m�moire revient � l'appellant de la fonction, pas � la fonction elle-m�me.
La solution la plus simple est de faire la modification sur la chaine en place. Sil l'appelant veut garder l'original, libre � lui de faire une copie avant :
Code:
1 2 3 4 5 6
| void to_upper(char *c)
{
for (; *c; ++c)
if (*c >= 'a' && *c <= 'z')
*c += 'A' - 'a';
} |
Une autre solution, pas tr�s satisfaisante, est de prendre deux arguments, l'un en entr�e, l'autre en sortie. Un peu moche.
Code:
1 2 3 4 5
| void to_upper(const char *in, char *out)
{
for (; *in; ++in, ++out)
*out = *in + (*in >= 'a' && *in <= 'z' ? 'A' - 'a' : 0);
} |
Voil�. C'est juste mon grain de sel...