printf mit # flag



  • Guten Abend,
    auf dieser Seite findet man ja eine schöne Übersicht wie man printf und verwandte Funktionen benutzen kann.

    Unter den Flags gibt es (space) + - 0 und #

    Die Erklärung bei dem #-Flag in Bezug auf e,E und f als specifier verstehe ich nicht.

    Da steht

    Used with e, E and f, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written.

    Ich übersetze das mal so wie ich das verstehe (vielleicht liegts ja schon daran...):

    Bei %f wird auf jeden Fall ein Komma mit ausgegeben, auch in dem Fall dass nach diesem Komma nur eine oder mehrere Nullen folgen würden weil es sich eigentlich um eine ganze Zahl handelt (also 12,0 hat ja den selben Wert wie 12)

    Ich muss ja für das %f einen Wert angeben, durch den das %f dann ersetzt wird. Wie soll ich denn so einen Wert angeben, ohne dass bei dem noch Nachkommastellen folgen (und sei es nur eine einzelne Null)??
    Ist dieses #-Flag damit nicht überflüssig?

    Wenn ich %f nehme, dann wird doch in jedem Fall ein "Komma" mit ausgegeben - selbst wenn nach diesem Komma nur eine 0 folgt. Oder anders gesagt, es ist mir doch gar nicht möglich für %f einen Wert anzugeben bei dem keine Stellen mehr folgen nach dem "."

    Ich muss ja schreiben:

    printf("%f",12.0f);
    

    weil

    printf("%f",12);
    

    liefert mir als Ausgabe

    0.000000
    

    weil ich ja kein float sondern ein int übergeben habe.

    Also nochmal: ich muss ja für %f ein float übergeben und dazu muss ich in printf als zweiten Parameter ja schon etwas in einer Schreibweise übergeben, welche bereits einen Dezimalpunkt (Komma) enthält...

    Also kann doch der Fall für den das #-Flag bei %f da ist, gar nicht eintreten.

    Oder???

    P.S.:
    Die einzige Erklärung was ich mir noch denken könnte ist, dass ein anderer Compiler dann für

    printf("%f",12);
    

    als Ausgabe

    12
    

    liefert wohingegen

    printf("%#f",12);
    

    als Ausgabe dann doch

    12.000000
    

    bringt.

    MfG



  • Das # ist bei %f nur relevant, wenn du als Präzision explizit 0 Nachkommastellen verlangst. Wie du deine Float- (bzw. Double-) Konstanten im Quelltext hinschreibst, ist egal. (Aber wenn du nur 12 hinschreibst, ist das nur ein Integer und hat damit den falschen Typ für %f)

    printf("%.0f\n", 12.0); /* Ausgabe "12" */
    printf("%#.0f\n", 12.0);/* Ausgabe "12." */
    printf("%#.0f\n", 12);  /* Undefined Behaviour, eventuell Ausgabe der aktuellen geogr. Position des Bernsteinzimmers */
    


  • Jo, ich dachte mir ja dass es nicht passt wenn ich für ein %f ein int angebe.

    Aber vielen Dank für deine Antwort! Jetzt macht das #-Flag doch Sinn.


Anmelden zum Antworten