J'ai demandé à la même question sur Pour la simplicité, j'ai également inclus le lien d'exemple en direct au-dessus de la ligne en ligne dans le code: p> si j'appelle cela avec: lorem ipsum 1 p>
BlockQuote> Où, comme j'aurais attendu: Lorem Ipsum 13 P> Peut-on expliquer la divergence? Quand je débogé, je reçois un Strncpy code>
, mais là le String code> finit par contenir la chaîne d'entrée complète. Lorsque vous passez une chaîne à
VSNPRINTF CODE> Le dernier caractère est toujours coupé: https://rexter.com / Uiqmx91570
foo ("lorem ipsum% d", 13) code> La sortie que je reçois est: p>
buf_size code> de 14 qui doit être suffisant pour contenir la chaîne entière, mais elle ne: ( p> p>
3 Réponses :
parce que la page de l'homme dit clairement que p>
Si la sortie a été tronquée en raison de cette limite, la valeur de retour est le nombre de caractères (n'incluant pas le suivi '\ 0') qui aurait été écrit à la chaîne finale si suffisamment d'espace avait été disponible. P > blockQuote>
Si vous vérifiez la valeur de retour de votre seconde
appel VSNPRINTF code>, vous verriez que la valeur de retour est égale à la taille, comme dans la page MAN: P>
Ainsi, une valeur de retour de taille ou plus signifie que la sortie était tronqué. p> blockQuote>
Le paramètre Vous voulez p> buf_size code> sur
vsnprintf code> Spécifie le nombre de caractères à écrire, , y compris em> strong> le caractère nul de terminaison. La valeur de retour est le nombre de caractères produits,
Quelqu'un peut-il expliquer la divergence? P> blockQuote>
Parce que leur comportement documenté est différent. P>
Strncpy () Code>
< / p>Si le nombre est atteint avant que l'ensemble du tableau SRC ait été copié, le tableau de caractères résultant n'est pas terminé par NULL (Strong>. P>. blockQuote>
mais
vsnprintf () code>
p>Au plus, les caractères BUF_SIZE-1 sont écrits. La chaîne de caractères résultante sera terminée avec un caractère null, sauf si buf_size est zéro. strong> p> blockQuote>
L'emphase est la mienne. P>
Pour paraphraser les réponses, au profit de
Strncpy code> fans:
Strncpy code> peut produire une chaîne C invalide (sans terminaison Nul);
vsnprintf code> ne peut pas.