-1
votes

Pourquoi VSNPRINTF n'écrire pas le même nombre de caractères que Strncpy serait?

J'ai demandé à la même question sur Strncpy , mais là le String finit par contenir la chaîne d'entrée complète. Lorsque vous passez une chaîne à VSNPRINTF Le dernier caractère est toujours coupé: https://rexter.com / Uiqmx91570

Pour la simplicité, j'ai également inclus le lien d'exemple en direct au-dessus de la ligne en ligne dans le code: xxx

si j'appelle cela avec: foo ("lorem ipsum% d", 13) La sortie que je reçois est:

lorem ipsum 1

Où, comme j'aurais attendu: Lorem Ipsum 13

Peut-on expliquer la divergence? Quand je débogé, je reçois un buf_size de 14 qui doit être suffisant pour contenir la chaîne entière, mais elle ne: (


1 commentaires

Pour paraphraser les réponses, au profit de Strncpy fans: Strncpy peut produire une chaîne C invalide (sans terminaison Nul); vsnprintf ne peut pas.


3 Réponses :


4
votes

parce que la page de l'homme dit clairement que

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.

Si vous vérifiez la valeur de retour de votre seconde appel VSNPRINTF , vous verriez que la valeur de retour est égale à la taille, comme dans la page MAN:

Ainsi, une valeur de retour de taille ou plus signifie que la sortie était tronqué.


0 commentaires

1
votes

Le paramètre buf_size sur vsnprintf Spécifie le nombre de caractères à écrire, , y compris le caractère nul de terminaison. La valeur de retour est le nombre de caractères produits, non compris le caractère NUL terminant.

Vous voulez xxx


0 commentaires

2
votes

Quelqu'un peut-il expliquer la divergence?

Parce que leur comportement documenté est différent.

Strncpy () < / 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>. .

mais vsnprintf ()

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.

L'emphase est la mienne.


0 commentaires