Scanf/Printf Doppelvariable C

Lesezeit: 3 Minuten

Benutzeravatar von Dragos Rizescu
Dragos Rizescu

Nehmen wir an, ich habe diesen folgenden Code in C:

double var;
scanf("%lf", &var);
printf("%lf", var);
printf("%f", var);

Es liest aus der stdin-Variablen ‘var’ und druckt dann zweimal in stdout ‘var’. Ich verstehe, dass Sie so eine doppelte Variable von stdin lesen, aber meine Fragen sind:

  1. Warum kann man mit %lf ein Double drucken?
  2. Warum kann man mit %f ein Double drucken?
  3. Welches ist besser und richtig zu verwenden?

  • Im printf Sie sind gleich.

    – Marun

    13. November 2013 um 11:15 Uhr

  • scanf nimmt Hinweise, die nicht befördert werden können, aber printf nimmt Werte, die können. in Bezug auf den Druck würde ich wahrscheinlich verwenden %lf da es für jeden, der Ihren Code liest, klarer ist.

    – robbie_c

    13. November 2013 um 11:16 Uhr


  • Mögliches Duplikat von Warum benötigt scanf() “%lf” für Doubles, wenn printf() nur mit “%f” in Ordnung ist?

    – phuklv

    9. September 2018 um 4:34 Uhr

Benutzeravatar von Yu Hao
Yu Hao

Für Funktionen mit variablen Argumenten wie printf und scanfwerden die Argumente heraufgestuft, z. B. werden alle kleineren ganzzahligen Typen heraufgestuft int, float befördert wird double.

scanf nimmt Parameter von Zeigern, sodass die Heraufstufungsregel keine Wirkung hat. Es muss verwendet werden %f zum float* und %lf zum double*.

printf werde niemals einen sehen float Streit, float wird immer befördert double. Der Formatbezeichner ist %f. Aber C99 sagt auch %lf ist das gleiche wie %f in printf:

C99 §7.19.6.1 Die fprintf Funktion

l (ell) Gibt an, dass eine folgende d, i, o, u, xoder X Konvertierungsspezifizierer gilt für a long int oder unsigned long int Streit; dass ein Gefolge n Konvertierungsbezeichner gilt für einen Zeiger auf a long int Streit; dass ein Gefolge c Konvertierungsspezifizierer gilt für a wint_t Streit; dass ein Gefolge s Konvertierungsbezeichner gilt für einen Zeiger auf a wchar_t Streit; oder hat keine Auswirkung auf ein Folgen a, A, e, E, f, F, goder G Konvertierungsbezeichner.

Wenn ein float übergeben wird printfwird es automatisch in a umgewandelt double. Dies ist Teil der Standardargument-Promotionsdie für Funktionen gelten, die eine variable Parameterliste (mit ...), vor allem aus historischen Gründen. Daher ist der „natürliche“ Spezifizierer für a float, %fmuss mit a arbeiten double Streit. Also die %f und %lf Spezifizierer für printf sind gleich; sie nehmen beide a double Wert.

Wann scanf aufgerufen wird, werden Zeiger übergeben, keine direkten Werte. Ein Hinweis auf float wird nicht in einen Zeiger auf umgewandelt double (Dies könnte nicht funktionieren, da sich das Objekt, auf das gezeigt wird, nicht ändern kann, wenn Sie den Zeigertyp ändern). So für scanfdas Argument für %f muss ein Hinweis darauf sein floatund das Argument für %lf muss ein Hinweis darauf sein double.

Soweit ich Handbuchseiten gelesen habe, sagt scanf, dass der Längenmodifikator „l“ (im Fall von Gleitkommazahlen) angibt, dass das Argument vom Typ double und nicht vom Typ float ist, sodass Sie „lf, le, lg“ haben können.

Was das Drucken betrifft, sagt das Handbuch offiziell, dass ‘l’ nur für Integer-Typen gilt. Daher wird es möglicherweise auf einigen Systemen oder von einigen Standards nicht unterstützt. Zum Beispiel erhalte ich beim Kompilieren mit die folgende Fehlermeldung gcc -Wall -Wextra -pedantic

a.c:6:1: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat=]

Sie sollten also überprüfen, ob Ihr Standard die Syntax unterstützt.

Abschließend würde ich sagen, dass Sie mit ‘%lf’ lesen und mit ‘%f’ drucken.

  • Wenn man die C99- und C11-Spezifikation als “offiziell” verwendet, heißt es: “l … hat keine Auswirkung auf einen folgenden a-, A-, e-, E-, f-, F-, g- oder G-Konvertierungsspezifizierer.”.

    – chux – Wiedereinsetzung von Monica

    13. November 2013 um 13:27 Uhr

  • Was ist „das Handbuch“? Dies ist keine nützliche Referenz ohne Titel und Version. Außerdem ist das aktuelle Jahr 2013, daher sollte davon abgeraten werden, Softwarespezifikationen von 1990 zu verwenden, wenn modernere Versionen verfügbar sind.

    – Eric Postpischil

    13. November 2013 um 14:28 Uhr

1408380cookie-checkScanf/Printf Doppelvariable C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy