Menu

Ecrire fonction strlcpy

stell-91 245 Messages postés dimanche 25 décembre 2011Date d'inscription 3 septembre 2018 Dernière intervention - 13 nov. 2017 à 00:14 - Dernière réponse : flagch 1 Messages postés lundi 9 juillet 2018Date d'inscription 9 juillet 2018 Dernière intervention
- 9 juil. 2018 à 23:08
Bonjour,

Je dois ecrire strlcpy en C, j'ai du mal a comprendre le man et je l'ai lu plusieurs fois.

Je vous explique d'abord ce que j'ai compris, dite moi si vous etes pas d'accord avec moi.

man strcpy
Elle prend 2 paramètres on doit copier src dans dest puis on ajoute un '\0' et on retourne dest
Si dest est plus courte que src alors on retourne les x caractères de src copier dans dest

man strncpy
Elle prend 3 paramètres on doit copier les n premiers caractères de src dans dest puis on ajoute des '\0' si nécessaire quand dest est plus long que src.

man strlcpy (ça devient compliquer)
Elle prend 3 paramètres (char *dest, char *src, unsigned int size)
Elle retourne la longueur qui est copiable de src dans dest.
En parallele il faut copier size - 1 caracteres de src dans dest et mettre un '\0' à la fin. La longueur retourner sera egale aux nombres de caracteres qui inclut le '\0'
Que doit on retourner si dest est plus court que src, que doit on copier dans dest ?

Merci pour votre aide

https://www.freebsd.org/cgi/man.cgi?query=strlcpy&sektion=3

http://manpagesfr.free.fr/man/man3/strcpy.3.html

Afficher la suite 

Votre réponse

9 réponses

Dalfab 356 Messages postés dimanche 7 février 2016Date d'inscription 16 septembre 2018 Dernière intervention - 13 nov. 2017 à 00:45
0
Merci
Bonjour,
Je trouve le man plus clair que tes explications!

strlcpy(dest,src,lgMax)
doit copier le plus de caractères possible de
src
dans
dest
, la taille max dans
dest
est
lgMax
.
Contrairement à
strncpy(dest,src,lgMax)
elle doit garantir que le terminateur est toujours écrit dans
dest[]
(si
src
est trop longue, il sera à la position
dest[lgMax-1]
, sinon
dest
sera une simple copie de
src
).
La fonction doit retourner la longueur de
src
.
stell-91 245 Messages postés dimanche 25 décembre 2011Date d'inscription 3 septembre 2018 Dernière intervention - 13 nov. 2017 à 22:55
Je veux etre sûr d'avoir bien compris

exemple
dest = "avion"
src = "bateau"
unsigned int size = 3

on va copier src dans dest donc le nouveau dest = "ba\0\0\0\0"
Tu es d'accord avec l'idée de ajouter suffisament de '\0' ?

valeur retourner 2 + 1, le 1 correspond '\0' tu valides ?

J'ai dit 2 + 1 à cause de cette phrase dans le man qui m'a mis le doute :
"functions return the total length of the string they tried to create."

autre cas
dest = "avion"
src = "bateau"
unsigned int size = 8

nouveau dest = ""bateau"\0
valeur retourner 6 + 1 c'est ça ?

https://www.freebsd.org/cgi/man.cgi?query=strlcpy&sektion=3

Tu es d'accord avec moi ?
Si c'est bon je pense avoir compris la subtilité de cette fonction.
Dalfab 356 Messages postés dimanche 7 février 2016Date d'inscription 16 septembre 2018 Dernière intervention > stell-91 245 Messages postés dimanche 25 décembre 2011Date d'inscription 3 septembre 2018 Dernière intervention - 13 nov. 2017 à 23:25
Relis le man

exemple
dest = "avion"
src = "bateau"
unsigned int size = 3

on va copier src dans dest donc le nouveau dest = "ba\0on\0" (max 3 caractères terminateur compris, les autres ne sont surtout pas modifiés)
Tu es d'accord avec l'idée de ajouter suffisament de '\0' ?
Non c'est pas dans le man.
valeur retourner 3 + 1, le 1 correspond '\0' tu valides ?
Non, on retourne 6 la longueur de "bateau" et le '\0' n'est pas compté
J'ai dit 3 + 1 à cause de cette phrase dans le man qui m'a mis le doute :
"functions return the total length of the string they tried to create."
En effet texte ambiguë, mais le man précise "For strlcpy() that means the length of src."

autre cas

dest = "avion"
src = "bateau"
unsigned int size = 8

nouveau dest = "bateau"\0 Oui
valeur retourner 6 + 1 c'est ça ? Non 6
stell-91 245 Messages postés dimanche 25 décembre 2011Date d'inscription 3 septembre 2018 Dernière intervention > Dalfab 356 Messages postés dimanche 7 février 2016Date d'inscription 16 septembre 2018 Dernière intervention - 14 nov. 2017 à 00:06
"on va copier src dans dest donc le nouveau dest = "ba\0on\0" (max 3 caractères terminateur compris, les autres ne sont surtout pas modifiés)
Tu es d'accord avec l'idée de ajouter suffisament de '\0' ?
Non c'est pas dans le man."


Oui excuse moi j'ai fait un raccourci tordu avec la fonction strncpy. Il faut ajouter un seul '\0'

Pour la valeur retourner, celle ci correspond à la valeur de src. Je rappelle que src n'est jamais modifié donc sa longueur reste inchangée, seul dest est modifié.

Si tu valides mes explications je pense avoir compris.
stell-91 245 Messages postés dimanche 25 décembre 2011Date d'inscription 3 septembre 2018 Dernière intervention > Dalfab 356 Messages postés dimanche 7 février 2016Date d'inscription 16 septembre 2018 Dernière intervention - 14 nov. 2017 à 23:42
"autre cas

dest = "avion"
src = "bateau"
unsigned int size = 8

nouveau dest = "bateau"\0 Oui
valeur retourner 6 + 1 c'est ça ? Non 6"


Après réflexion je pense que cet exemple devrait planter. ? Après le sixième caractère on essaie de lire dans de la mémoire qui n'existe pas.
Dalfab 356 Messages postés dimanche 7 février 2016Date d'inscription 16 septembre 2018 Dernière intervention > stell-91 245 Messages postés dimanche 25 décembre 2011Date d'inscription 3 septembre 2018 Dernière intervention - 15 nov. 2017 à 00:47
Si on a respecté le contrat, il ne plante pas (la size 8 doit être <= à la taille du buffer dest)
char dest[8];
strcpy( dest , "avion" );
strlcpy( dest , "bateau" , 8 );
// ne plante pas

char *dest = "avion avec beaucoup de place";
strlcpy( dest , "bateau" , 8 );
// est un Undefined Behaviour, qui peut planter ou pas (sur un PC plante rarement, dans l'embarqué plante souvent) car une chaîne littérale est un pointeur sur une zone qui ne doit pas être écrite
La ligne 6 doit provoquer un warning en C, et c'est une erreur en C++.
Commenter la réponse de Dalfab
flagch 1 Messages postés lundi 9 juillet 2018Date d'inscription 9 juillet 2018 Dernière intervention - Modifié par flagch le 9/07/2018 à 23:15
0
Merci
Salut les amis,

Je n'ai pas creusé la question en elle-même, d'autant que ça fait quinze ans au moins que je n'ai plus fait de C...

Je me permets juste une remarque car vos échanges sont assez symptomatiques d'un problème récurrent qui se pose avec de plus en plus d'acuité : l'absolue nécessité de maîtriser le langage - je parle bien de la langue (le français en l'occurrence) et non un langage informatique - pour solutionner des problèmes plus ou moins complexes. Sans langage, la pensée est impossible, et réciproquement. Donc il devient compliqué de communiquer dès lors qu'on n'est pas capable d'exprimer sa pensée de façon claire.

Tout aussi important que de savoir mettre des mots sur ce qu'on pense, l'absolue nécessité de comprendre un texte lu (ou écouté). La meilleure documentation technique ne vaut rien si l'on n'est pas capable de saisir les nuances du langage.

Si on veut transmettre des idées, il est indispensable de posséder quelques bases linguistiques comme par exemple :
- un minimum de vocabulaire nuit rarement
- quelques vagues notions de grammaire peuvent occasionnellement aider
- la PONCTUATION : souvent négligée mais ô combien importante ! Mal (ou pas) utilisée, la ponctuation rend un texte aussi illisible qu'une fonction mathématique dans laquelle on aurait mélangé aléatoirement les opérateurs.

Étant moi-même développeur, mais aussi et surtout amoureux de la langue (particulièrement la mienne : le français), j'ai été mille fois confronté à des collègues incapables d'énoncer en français un problème simple du point de vue logique ou mathématique. Résultat : on se retrouve immanquablement dans une impasse. On peut être un génie mais, sans pouvoir expliquer clairement notre trouvaille, on est incapable de la transmettre. Pas besoin d'être informaticien non plus pour voir les dégâts que provoque notre faible maîtrise du langage : qui n'a jamais expérimenté un SMS mal interprété pour cause de grêve de la virgule ? La virgule est selon moi une des premières causes de divorce de nos jours !

Et je ne parle même pas du point de suspension... qui est... devenu avec l'avènement (avénement pour les puristes !) du langage SMS... une vraie calamité de... notre... temps. Quoi de plus simple, en effet, de presser trois fois sur cette touche POINT pour modifier complètement le sens de ce qui précède ?

Je ne sais plus vraiment pourquoi j'ai commencé à rédiger ce post, d'autant qu'il n'apporte pas grand chose à la question initiale :))))
C'était juste pour attirer l'attention du lecteur sur l'importance d'apprendre le français, et pas uniquement l'orthographe mais surtout la grammaire, et particulièrement la syntaxe. C'est essentiel. Primordial !
Peut-être aussi pour me venger gentiment de mes collègues qui me prenaient presque pour un "teubé" quand je leur disais que ce qu'ils me disaient ou m'écrivaient surtout n'était simplement pas logique, pas français.

Bond; j'arêtes las espérant n'avoir pas commis trop de phôtes qu'on-promet-tantes en rédigeant ceux laïus, si non j'aux raies l'aire daim qu'on nom ? :)
Commenter la réponse de flagch