Wofür ist der richtige Formatbezeichner double
in printf? Ist es %f
oder ist es %lf
? Ich glaube es ist %f
, aber ich bin nicht sicher.
Codebeispiel
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
c
floating-point
printf
double
format-specifiers
Leopard
quelle
quelle
"%lf"
nicht weiterkommen, ist dies nicht definiert. In C99- und C11-Bibliotheken ist es dasselbe wie"%f"
.%lf
ist der richtige Formatbezeichner fürdouble
. Aber es wurde so in C99. Vorher musste man verwenden%f
.Antworten:
"%f"
ist das (oder mindestens ein) richtige Format für ein Double. Es gibt kein Format für afloat
, denn wenn Sie versuchen, ein anfloat
zu übergebenprintf
, wird es heraufgestuft,double
bevor esprintf
empfangen wird 1 ."%lf"
ist auch nach dem aktuellen Standard akzeptabel - dasl
wird als wirkungslos angegeben, wenn esf
unter anderem vom Konvertierungsspezifizierer befolgt wird .Beachten Sie, dass sich Formatzeichenfolgen an dieser Stelle
printf
erheblich von Formatzeichenfolgenscanf
(undfscanf
usw.) unterscheiden. Für die Ausgabe übergeben Sie einen Wert , der vonfloat
bisdouble
hochgeschrieben wird , wenn er als variadischer Parameter übergeben wird. Für die Eingabe vorbei sind Sie einen Zeiger , die nicht gefördert wird, so muss man sagen ,scanf
ob Sie ein lesen möchtenfloat
oder eindouble
, so fürscanf
,%f
Mittel Sie lesen möchtenfloat
und%lf
Mittel Sie lesen wollendouble
(und für das, was es ist wert, für along double
, verwenden Sie%Lf
entwederprintf
oderscanf
).1. C99, §6.5.2.2 / 6: "Wenn der Ausdruck, der die aufgerufene Funktion bezeichnet, einen Typ hat, der keinen Prototyp enthält, werden die Ganzzahl-Heraufstufungen für jedes Argument ausgeführt, und Argumente mit dem Typ float werden auf double heraufgestuft. Diese werden als Standardargumentwerbung bezeichnet. " In C ++ ist der Wortlaut etwas anders (z. B. wird das Wort "Prototyp" nicht verwendet), aber der Effekt ist der gleiche: Alle variadischen Parameter werden standardmäßig hochgestuft, bevor sie von der Funktion empfangen werden.
quelle
g++
Spuck%lf
beim Kompilieren mit-Wall -Werror -pedantic
:error: ISO C++ does not support the ‘%lf’ gnu_printf format
l
eine Erweiterung. Die Standards C99 / 11 und C ++ 11 erfordern die Implementierung, um dies zu ermöglichen.scanf
macht Mangeldouble
s vertreten durch%lf
: es beklagt , dass es erwartet ,float *
und fanddouble *
mit nur%f
.scanf
nimmt Verweise, wo zu speichern , was es liest, so Bedürfnisse zu wissen , wie groß der Raum ist Spitz an ist, währendprintf
die Werte nimmt sich selbst und „Standardargument Promotions“ bedeuten sowohl Ende als updouble
s, so dasl
ist im Wesentlichen optional.In Anbetracht des C99- Standards (nämlich des N1256- Entwurfs) hängen die Regeln von der Funktionsart ab: fprintf (printf, sprintf, ...) oder scanf.
Hier werden relevante Teile extrahiert:
Die gleichen Regeln festgelegt für
fprintf
beantragenprintf
,sprintf
und ähnliche Funktionen.Kurz gesagt, für
fprintf
die folgenden Spezifizierer und entsprechenden Typen werden angegeben:%f
-> doppelt%Lf
-> langes Doppel.und dafür
fscanf
ist:%f
-> schweben%lf
-> doppelt%Lf
-> langes Doppel.quelle
Es kann sein
%f
,%g
oder%e
je nachdem , wie Sie wollen , dass die Zahl formatiert werden. Sehen Sie hier für weitere Details. Derl
Modifikator wird inscanf
mitdouble
, aber nicht in benötigtprintf
.quelle
l
Modifikator -1: (Kleinbuchstaben) gilt für Ganzzahltypen ( cplusplus.com/reference/clibrary/cstdio/printf ) undL
für Gleitkommatypen. AußerdemL
erwartet der Modifikator einelong double
, keine Ebenedouble
.l
nicht in erforderlich istprintf
fürdouble
.Format
%lf
ist ein perfekt korrektesprintf
Format fürdouble
genau das, was Sie verwendet haben. Es ist nichts falsch mit Ihrem Code.Format
%lf
inprintf
wurde in alten (vor C99) Versionen der C-Sprache nicht unterstützt, was zu oberflächlichen "Inkonsistenzen" zwischen Formatspezifizierern fürdouble
inprintf
und führtescanf
. Diese oberflächliche Inkonsistenz wurde in C99 behoben.Sie müssen nicht
%lf
mitdouble
in verwendenprintf
. Sie können auch verwenden%f
, wenn Sie dies bevorzugen (%lf
und%f
in gleichwertig sindprintf
). Aber im modernen C ist es absolut sinnvoll, es vorzuziehen,%f
mitfloat
,%lf
mitdouble
und%Lf
mitlong double
konsequent in beidenprintf
und zu verwendenscanf
.quelle
scanf()
,"%f"
,"%lf"
paßt einfloat *, double *
, nichtfloat, double
wie sie in der letzten Zeile angedeutet.%Lf
(Beachten Sie das GroßbuchstabenL
) ist der Formatbezeichner für lange Doubles .Für Ebene
doubles
, entweder%e
,%E
,%f
,%g
oder%G
tun wird.quelle
%g
und%G
?