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...