11
votes

Devrais-je utiliser wsprintf () pour imprimer un double comme une large chaîne?

Je suis incapable d'imprimer double code> à l'aide de wsprintf () code>. J'ai essayé sprintf () code> et cela a fonctionné bien.

Syntaxe utilisée pour wsprintf () code> et sprintf () code> est comme suit: P>

wsprintf(str,TEXT("Square is %lf "),iSquare); // Does not show value

sprintf(str," square is %lf",iSquare);  // works okay


3 commentaires

Est str une chaîne de caractères large?


@Pascalcuoq: Dans ce contexte, une macro Windows (Microsoft) qui se développe à l . Plutôt verbose et orienter-surmonté.


"% LF" est pour Double double Arguments. Utilisez un fichier clair "% f" pour un double argument. Je ne sais pas si "% lf" est valide en standard C ++.


4 Réponses :


-2
votes

Vraisemblablement, vous n'êtes pas compilé à Unicode et que le texte est défini à une chaîne ordinaire.


2 commentaires

J'ai évité depuis la réponse. Mais cela n'a pas l'air d'avoir mis beaucoup d'effort pour découvrir wsprintf () .


Vous êtes correct, je n'ai pas cherché wsprintf. Clairement l'OP n'a pas non plus été. J'ai pris une supposition et j'avais tort; Je vais partir pour la postérité.



2
votes

wsprintf ne prend pas en charge le point flottant. Voir son Documentation - lf n'est pas répertorié comme code de format valide.

the Swprintf pièce de fonction de la bibliothèque Standard Visual Studio est ce que vous voulez. Il prend en charge tous les codes de format que sprintf fait.


0 commentaires

32
votes

wsprintf ne prend pas en charge le point flottant. L'erreur utilise du tout.

Si vous voulez quelque chose comme sprintf , mais pour les caractères / chaînes larges, vous voulez swprintf à la place.

En réalité, puisque vous utilisez le texte macro , vous voulez probablement _sprintf à la place: il passera d'une implémentation étroite à large en synchronisation avec le même Les macros de préprocesseur en tant que texte utilisent pour décider si la chaîne sera étroite ou large. Toutefois, toute cette approche est en grande partie une relique des jours où Microsoft a toujours vendu et appuyé des versions de Windows basées sur le noyau NT 32 bits et sur le noyau 16 bits. Les versions de 16 bits n'avaient que une prise en charge extrêmement minimale de caractère large, de sorte que Microsoft a travaillé dur pour permettre à une base de code source unique à compiler pour utiliser des caractères étroits (ciblant des noyaux 16 bits) ou des caractères (pour cibler le 32 bits. graines). Les noyaux de 16 bits sont partis pour assez longtemps que presque personne n'a vraiment beaucoup de raison de les soutenir.

Pour ce que ça vaut la peine: wsprintf est presque entièrement une relique historique. Le w apparemment représente Windows . Il a été inclus dans Windows Way Retour lorsque (retour aux jours de 16 bits). Il a été écrit sans soutien au point flottant, car à cette époque, Windows n'utilise aucun point flottant en interne - cela fait partie de la raison pour laquelle il a des routines comme MULDIV , même si cela fait (à peu près) la même chose avec un point flottant est assez trivial.


5 commentaires

Heck, il a couru sur des systèmes assez importants qui n'avaient pas du tout de matériel à virgule flottante. Même Windows 95 a soutenu le 80386 sans 387 FPU.


Oui cela fonctionne. J'ai utilisé le "_sprintf_s" Cette méthode est exactement ce que je veux. Merci de votre aide. msdn.microsoft.com/en-us/library/ce3zzk1k.aspx


"Il a été inclus dans l'arrière de Windows Retour lorsque (retour au moins Windows 2.1, probablement Windows 1)." Pas vrai. Il a été disponible pour la première fois dans Windows 3.0, et non Windows 2.x NOR 1.X.


@ Raymai97: Je vais devoir prendre votre parole pour cela. J'ai perdu tous les documents que j'avais sur les fenêtres de Pre-32 bits 3 ou 4 bouge il y a ...


Je conseillerais à l'OP juste de laisser tomber le texte et t entièrement, à moins que la compatibilité de code source avec des versions de Windows du début des années 90 est vraiment une exigence.



2
votes

La fonction wsprintf () ne prend pas en charge les paramètres de point flottant, essayez d'utiliser swprintf () si vous travaillez avec des valeurs de point flottant.

Plus d'informations sur Swprint peut être trouvée ici


0 commentaires