6
votes

Quels sont les nombres maximaux de caractères émis par Sprintf lors de la sortie de flotteur et de double variables?

Si je fais cela: xxx

et xxx

Quel est le nombre maximum de caractères pouvant être émis par chaque fonction?


6 commentaires

Vous pouvez toujours contrôler ce montant: lix.polytechnique.fr/~liberti/public/computing/prog/c/c/...


Je ne veux pas le contrôler. Je veux imprimer tout ce qu'il va normalement imprimer et savoir ce que le max est pour cela.


Une partie de ceci est déjà répondu. Au moins pour les doubles: Stackoverflow.com/Questtions/1701055/...


Impressionnant. J'ai cherché avant de poster, et celui-ci n'est pas venu. Il n'est pas venu de la recherche de pré-question, non plus.


@Doug t.: printf ne prend pas de pointeur, il prend la valeur de flotteur elle-même; Le spécificateur % LF n'est nécessaire que pour scanf - il n'a aucune signification pour printf (§7.20.6.1 Paragraphe 7: "Les modificateurs de longueur et leurs significations sont ... l ... n'a aucun effet sur un spécificateur de conversion suivant A, A, E, E, F, G ou G. ")


@Doug T. Ajout au commentaire de Stephen Canon, Printf permettra à tous les arguments flottants à doubler avant de les imprimer.


3 Réponses :


1
votes

Un programme de test rapide Tuyé via WC -C montre 47 caractères pour flotter et 317 pour le double. Le programme: xxx

Notez que vous pouvez utiliser SNPRINTF pour limiter la sortie à N caractères.


6 commentaires

Ou utilisez snaprintf (null, 0, ...); pour savoir combien de caractères seront nécessaires pour le tampon afin que vous puissiez allouer cela beaucoup.


Je ferai probablement la solution SnPrintf dans ce commentaire. De mon autre lecture sur le sujet, je ne suis pas convaincu à 100% 317 est le max. Je suis surtout convaincu, mais pas assez pour publier du code critique de la mission avec elle. :)


SnPrintf n'est pas défini dans notre codeBase. J'ai essayé #include "stdio.h" sans chance.


@Almo Si vous utilisez MSVC, essayez d'utiliser _snprintf


_Snprintf_s me dit simplement que le tampon que je lui donne est trop petit. Si j'ai besoin de savoir à quel point le tampon doit être important pour que je me dise à quel point j'ai besoin de tampon, je ne vois pas le point.


En regardant une autre discussion ( Stackoverflow.com/questions/2915672 / ... ) et les liens qui y figurent, il est clair que la SP ne se soucie pas de telles banalités telles que des normes ou des commodités. MS dit qu'ils se concentrent sur les parties C ++, il semble donc que vous ayez quelques options: utilisez% g, utilisez un gros tampon (1080? D'en haut) ou utilisez C ++ (STD :: String, je crois).



2
votes

Conclusion:

J'étais incapable de me dire à Snprintf de me dire quelle serait la taille de la chaîne, et je veux garder le code comme étant indépendant du compilateur que possible. Voici donc la solution que j'ai proposée. xxx

% g résulte le nombre de notation scientifique, qui limite gravement le nombre de caractères. J'ai choisi un tampon assez grand pour contenir tout ce qui pourrait sortir. Ma seule dépendance compilée est sur Sprintf_s.


0 commentaires

5
votes

Via test, à l'aide de MS Visual Studio 10, une chaîne de 811 résulte de xxx

des chaînes plus longues sont possibles avec des valeurs de précision plus grandes.

mais rester avec " % f ", le nombre maximal de caractères de sortie est 317 + 1 pour le '\ 0'.
Donc, pour le code portable: xxx

la fonction printflfloat (numéro de flotteur) paramètre isolaire "numéro", étant un flotteur et limité à la gamme de flotteurs, est converti en double en passant à Sprintf (). Sa valeur maximale est donc flt_max. Le nombre maximum de caractères est donc de 47 + 1 pour le '\ 0'. xxx


0 commentaires