fgets(ptr, size, stream) reads in at most one less than size characters from stream and stores them into the buffer pointed to by ptr. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('\0'
) is stored after the last character in the buffer.
C'est presque le mieux qu'on puisse espérer, non ? on lui passe un buffer alloué avec data[N]
comme (data, N)
et il se garde un dernier p'tit caractère pour \0
de fin-de-chaîne. Que demander de mieux ? Non, en vérité, c'est de strncpy qu'il faut se méfier.Mais de ma phase de déni/doute, je me suis quand-même refait un p'tit programme pour tirer ça au clair. Bin rien à redire. On a bien un
\0
de terminaison à chaque coup (le programme ne lit que 16 caractères à la fois). Soit juste après le retour à la ligne (\n
), soit en dernière position.Seul cas où il peut être manquant: si il n'y avait rien à lire du tout. (auquel cas fgets nous renvoie un pointeur nul plutôt qu'un pointeur vers notre buffer, ce bon vieux
data
). Même une fin de flux sans fin de ligne ne le met pas en défaut.
c'est de strncpy qu'il faut se méfier
ReplyDelete...
Bin oui, parce qu'apparemment, strncpy n'a jamais été conçu comme un 'strcpy avec une destination limitée', mais bien comme une 'copie d'une chaine de taille fixe N'