J'ai décidé de faire un wrapper pour strncpy
car mon code source me demande de faire beaucoup de copies de chaînes. Et je veux m'assurer que la chaîne est terminée si la source est égale ou supérieure à la destination.Création d'un wrapper pour strncpy à insérer Terminer null
Ce code sera utilisé en production, donc je veux juste voir s'il y a des dangers potentiels en utilisant cette enveloppe.
Je n'ai jamais fait d'emballage auparavant, donc j'essaie de le rendre parfait.
Un grand merci pour tous les conseils,
/* Null terminate a string after coping */
char* strncpy_wrapper(char *dest, const char* source,
const size_t dest_size, const size_t source_size)
{
strncpy(dest, source, dest_size);
/*
* Compare the different length, if source is greater
* or equal to the destination terminate with a null.
*/
if(source_size >= dest_size)
{
dest[dest_size - 1] = '\0';
}
return dest;
}
==== ==== mis à jour sous la direction
/* Null terminate a string after coping */
char* strncpy_wrapper(char *dest, const char* source,
const size_t dest_size)
{
strncpy(dest, source, dest_size);
/*
* If the destination is greater than zero terminate with a null.
*/
if(dest_size > 0)
{
dest[dest_size - 1] = '\0';
}
else
{
dest[0] = '\0'; /* Return empty string if the destination is zero length */
}
return dest;
}
Je viens d'éditer ma question avec le code source mis à jour. J'ai mis un sinon. Si la dest est supérieure à 0. Terminez toujours le dernier élément. Sinon, insérez une valeur nulle dans le premier élément [0] et renvoyez une chaîne de destination vide. Qu'est-ce que ça sonne? – ant2009
Vous ne pouvez pas stocker un '\ 0' dans * dest * si * dest * a une taille nulle. Vous n'êtes pas autorisé à le faire, car vous ne pouvez accéder qu'aux caractères zéro, mais l'enregistrement d'un \ 0 signifie que vous accédez à un caractère. Je ne pense pas que ce soit un problème de mourir, c'est comme une division par zéro erreurs. Cela n'a aucun sens d'appeler votre fonction avec * dest_size == 0 *. C'est une bonne idée de * échouer tôt *, alors vous savez au moins où vous avez foiré (dans l'appel à strncpy()). Imaginez que l'opération de division échoue silencieusement et vous donne des déchets aléatoires. très difficile à déboguer. – Inshallah