[C] fprintf float specifier 0 padding wordt niet geprint

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 08:14
Ik wil een double waarde printen met de functie fprintf. Ik gebruik hier de %02.5f voor. Hiermee dacht ik te bereiken dat de voorbeeld waarde 2.03 als 02.03000 geprint zou worden.

Even wat minimale code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(void)
{
    fprintf(stdout, "%02.5f\n", 2.0103);
    fprintf(stdout, "%02.5d\n", 2);
    return 0;

/* OUTPUT:
2.01030
02
*/

/* GEWENSTE OUTPUT:
02.01030
02
*/
}

Wie of wat zie ik over het hoofd? Mag de width niet opgeven worden bij floats?
http://www.cplusplus.com/reference/clibrary/cstdio/printf/ zegt er niets over?

Het C Handboek zegt het volgende:
"double; decimale notatie van de vorm [-]m.dddddd, waarbij het aantal d's is gegeven door de precisie. De precisie is bij verstek (default) 6; met een precisi van 0 wordt de decimaalpunt niet afgedrukt" (bladzijde 332).
Dit komt er op neer dat wat ik wil niet gaat lukken?

[ Voor 41% gewijzigd door Gehakt op 11-12-2009 11:52 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Je maakt sws een fout, jij verwijst naar prinf als handleiding, maar je gebruikt fprintf in je code. http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/

[ Voor 100% gewijzigd door Matis op 11-12-2009 11:48 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 08:14
Je hebt gelijk. Maar dat maakt voor de verdere werking van de specifiers niet zoveel uit volgens mij.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

en als je je waarde eens cast naar een float; dus
C++:
1
2
3
4
5
6
7
8
#include <stdio.h>

int main(void)
{
    fprintf(stdout, "%02.5f\n", (float)2.0103);
    fprintf(stdout, "%02.5d\n", (float)2.0);
    return 0;
}

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 08:14
Het casten naar een float dan moet ook de specifier bij jou op regel 6 in f verandert worden.
De output is dan:
code:
1
2
2.01030
2.00000

Ik denk dus dat de functies niet bieden wat ik wil.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Gehakt schreef op vrijdag 11 december 2009 @ 11:51:
Het casten naar een float dan moet ook de specifier bij jou op regel 6 in f verandert worden.
De output is dan:
code:
1
2
2.01030
2.00000

Ik denk dus dat de functies niet bieden wat ik wil.
My bad :X
Ik zou niet kunnen bedenken waarom het niet werkt.

Als je nu alleen eens probeert de leftpadding aan de gang te krijgen.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 15-09 21:32
Voor de punt moet het totaal aantal charachters staan (inclusief de punt), en niet het aantal characters voor de punt.

[ Voor 4% gewijzigd door dik_voormekaar op 11-12-2009 11:55 ]


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 08:14
dik_voormekaar schreef op vrijdag 11 december 2009 @ 11:54:
Voor de punt moet het totaal aantal charachters staan (inclusief de punt), en niet het aantal characters voor de punt.
Je bent mijn held. Het is ook echt weer zoiets simpels. |:( Ik ben altijd in de veronderstelling geweest dat je daarmee het aantal cijfers voor de punt aangaf.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Het is inderdaad %breedte.precisie. Denk er ook aan dat printf nooit afkapt, dus "breedte" is niet tevens "maximale breedte"

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Matis schreef op vrijdag 11 december 2009 @ 11:48:
en als je je waarde eens cast naar een float; dus
C++:
1
2
3
4
5
6
7
8
#include <stdio.h>

int main(void)
{
    fprintf(stdout, "%02.5f\n", (float)2.0103);
    fprintf(stdout, "%02.5d\n", (float)2.0);
    return 0;
}
Nutteloos, hiermee verwijder je mogelijk alleen maar extra precisie. Floats die als vararg meegegeven worden worden sowieso impliciet gecast naar double.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
De printf() specificatie is vrij duidelijk: eerst flags (zoals het padding-karakter 0), dan de minimumbreedte dan (optioneel) de gewenste precisie. De minimumbreedte geldt voor de volledige uitvoer, dus als je twee cijfers vóór de komma en vijf erachter wil hebben, met een punt in het midden, heb je minimaal 2 + 5 + 1 = 8 karakters nodig. Dit zou dus wél moeten werken:
C:
1
printf("%08.5f\n", 2.0103);

Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 08:14
Soultaker schreef op vrijdag 11 december 2009 @ 14:04:
De printf() specificatie is vrij duidelijk: eerst flags (zoals het padding-karakter 0), dan de minimumbreedte dan (optioneel) de gewenste precisie. De minimumbreedte geldt voor de volledige uitvoer, dus als je twee cijfers vóór de komma en vijf erachter wil hebben, met een punt in het midden, heb je minimaal 2 + 5 + 1 = 8 karakters nodig. Dit zou dus wél moeten werken:
C:
1
printf("%08.5f\n", 2.0103);
Klopt zo werkt het voorbeeld prima in mijn code. Zoals ik al zei ben ik altijd in de veronderstelling geweest dat het getal voor de punt alleen de breedte van de gehele getallen aangaf. Aangezien ik verder nooit padding gebruikt heb ben ik ook nooit achter deze fout in mijn denkwijze gekomen. Weer wat geleerd dus.
Pagina: 1