585 Stimmen

Korrekte Formatangabe für double in printf

Was ist der richtige Formatbezeichner für double in printf? Ist es %f oder ist es %lf ? Ich glaube, es ist %f aber ich bin mir nicht sicher.

Code-Beispiel

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

780voto

Jerry Coffin Punkte 452852

"%f" ist das (oder zumindest ein) korrektes Format für ein Double. Dort ist kein Format für eine float , denn wenn Sie versuchen, eine float a printf wird sie befördert nach double vor printf erhält sie 1 . "%lf" ist auch nach dem derzeitigen Standard akzeptabel - die l wird angegeben, dass sie keine Wirkung hat, wenn sie von der Option f Konvertierungsspezifizierer (neben anderen).

Beachten Sie, dass dies ein Ort ist, an dem printf Formatstrings unterscheiden sich wesentlich von scanf (und fscanf usw.) formatieren. Für die Ausgabe übergeben Sie eine Wert , die von float a double wenn sie als variabler Parameter übergeben wird. Für die Eingabe übergeben Sie eine Zeiger was nicht gefördert wird, also müssen Sie sagen scanf ob Sie einen Artikel lesen wollen float oder eine double also für scanf , %f bedeutet, dass Sie eine float y %lf bedeutet, dass Sie eine double (und, was es wert ist, für einen long double verwenden Sie %Lf entweder für printf o scanf ).


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 Integer-Promotionen für jedes Argument durchgeführt, und Argumente, die den Typ float haben, werden zu double promoted. Diese werden als Standard-Argument-Promotionen bezeichnet." In C++ ist der Wortlaut etwas anders (z. B. wird das Wort "Prototyp" nicht verwendet), aber die Wirkung ist dieselbe: alle variablen Parameter werden standardmäßig promotiert, bevor sie von der Funktion empfangen werden.

66voto

mloskot Punkte 34861

Angesichts der C99 Standard (nämlich die N1256 Entwurf), hängen die Regeln von der Funktionsart: fprintf (printf, sprintf, ...) oder scanf.

Hier sind relevante Teile extrahiert:

Vorwort

Diese zweite Ausgabe annulliert und ersetzt die erste Ausgabe, ISO/IEC 9899:1990, die durch ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995 und ISO/IEC 9899/COR2:1996 ergänzt und korrigiert wurde. Zu den wichtigsten Änderungen gegenüber der vorherigen Ausgabe gehören:

  • %lf Konvertierungsspezifizierer erlaubt in printf

7.19.6.1 Die fprintf Funktion

7 Die Längenmodifikatoren und ihre Bedeutungen sind:

l (ell) Gibt an, dass (...) keine Auswirkung auf einen nachfolgenden a, A, e, E, f, F, g oder G Konvertierungsspezifizierer hat.

L Gibt an, dass ein nachfolgender a-, A-, e-, E-, f-, F-, g- oder G-Konvertierungsspezifizierer für ein Long-Double-Argument gilt.

Dieselben Regeln, die für fprintf beantragen printf , sprintf und ähnliche Funktionen.

7.19.6.2 Die fscanf Funktion

11 Die Längenmodifikatoren und ihre Bedeutungen sind:

l (ell) Gibt an, dass (...) dass ein nachfolgender a-, A-, e-, E-, f-, F-, g- oder G-Konvertierungsspezifizierer für ein Argument mit dem Typ Zeiger auf double gilt;

L Gibt an, dass eine auf a, A, e, E, f, F, g oder G folgende Umwandlung auf ein Argument mit dem Typ Zeiger auf long double angewendet wird.

12 Die Konvertierungsspezifizierer und ihre Bedeutungen sind: a,e,f,g Entspricht einer Gleitkommazahl mit Vorzeichen, (...)

14 Die Konvertierungsspezifizierer A, E, F, G und X sind ebenfalls gültig und verhalten sich genauso wie a, e, f, g und x.

Lange Rede, kurzer Sinn, für fprintf werden die folgenden Spezifizierer und die entsprechenden Typen angegeben:

  • %f -> doppelt
  • %Lf -> long double.

und für fscanf es ist:

  • %f -> Schwimmer
  • %lf -> doppelt
  • %Lf -> long double.

37voto

vitaut Punkte 42467

Sie kann sein %f , %g o %e je nachdem, wie die Zahl formatiert werden soll. Siehe ici für weitere Einzelheiten. Die l Modifikator ist erforderlich in scanf con double , aber nicht in printf .

20voto

AnT Punkte 300728

Format %lf ist eine völlig korrekte printf Format für double genau so, wie Sie es verwendet haben. Mit Ihrem Code ist alles in Ordnung.

Format %lf en printf wurde in alten (vor C99) Versionen der Sprache C nicht unterstützt, was zu einer oberflächlichen "Inkonsistenz" zwischen den Formatspezifikationen für double en printf y scanf . Diese oberflächliche Unstimmigkeit wurde in C99 behoben.

Sie sind nicht verpflichtet, Folgendes zu verwenden %lf con double en printf . Sie können verwenden %f auch, wenn Sie es wünschen ( %lf y %f sind gleichwertig in printf ). Aber in modernem C macht es durchaus Sinn, die Verwendung von %f con float , %lf con double y %Lf con long double durchgängig in beiden printf y scanf .

12voto

Frédéric Hamidi Punkte 249635

%Lf (beachten Sie das Kapital L ) ist die Formatbezeichner für lange Doppelgänger .

Für einfache doubles entweder %e , %E , %f , %g o %G ausreichen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X