2013-04-02 7 views
6

Mam świadomość, że umieszczenie dowolnej liczby 0 przed szerokością elementu zastępczego powoduje wypełnianie zerami. Na przykład printf("%02d", 6); drukuje 06.Jaka jest różnica pomiędzy% 0.2lf a% .2lf jako symboli zastępczych printf?

Co jednak oznacza umieszczenie pojedynczego 0 przed dokładnością elementu zastępczego? Na przykład dla wartości printf("%0.2lf", 0.123); i printf("%.2lf", 0.123); wyjście ma wartość 0.12.

Jeśli nic nie robi, czy istnieje preferowany format?

+0

@teppic, 0 nie oznacza minimalnej szerokości 0 (jakiego rodzaju bezużyteczne informacje to?). 0 oznacza flagę oznaczającą "0-pad" zamiast "pad". Z Twojej odpowiedzi wynika, że ​​już to wiesz, więc przestań mówić, że oznacza "minimalna szerokość 0", ponieważ tak nie jest. – Shahbaz

+0

@Shahbaz - Mówiłem o tym konkretnym przypadku, ale ponieważ zdaje się powodować zamieszanie, usunąłem komentarz. – teppic

Odpowiedz

6

Są one "równoważne". Jeśli używałbyś "% 07.2", to zrobiłoby to różnicę, dodając dodatkowe zera z przodu.

Edytuj: Oryginalnie miał "% 04.2", co oczywiście nie robi żadnej różnicy, ponieważ zmiennoprzecinkowe z dwoma miejscami dziesiętnymi są zawsze 4 szerokie.

+0

Czy to nie jest (dopełnienie "0") ignorowane dla zmiennoprzecinkowego, jeśli jest określona precyzja jawnie? – dyp

+0

Przynajmniej podczas testowania gcc w Linuksie zerowe wypełnienie "działa". Jestem pewien, że to część standardu, ale jestem trochę leniwy, więc poczekam, aż ktoś inny zwróci uwagę, że się mylę. –

+0

@DyP - dopełnienie zer znajduje się po lewej stronie, np. 0003.12. Nie działa dla zer po przecinku dziesiętnym. – teppic

3


%3.2f //(print as a floating point at least 3 wide and a precision of 2)

%0.2lf //(print as a floating point at least 0 wide and a precision of 2)

%.2lf //(print as a floating point at least 0(default) wide and a precision of 2)

1

Blockquote

Zasadniczo, kiedy % w.p f wyjścia w oznacza minimalną liczbę pozycji być używany do wyświetlania wartości i p odnosi się do cyfry po przecinku. %3.2f zmiennoprzecinkowy o 3 szerokie i 2 Numer po przecinku

%0.2f zmiennym co najmniej 0 szerokości i 2 numerem po przecinku

%.2f zmiennym co najmniej 0 (domyślnie) szerokości i dokładność 2)

Ale nie zrozumcie źle o szerokości 0, jeśli używacie %0.2f, możecie automatycznie dostosować jej minimalną szerokość.

1

Przykłady te powinny wykazywać różnicę:

"%0.2lf", 0.123 ->0.12 (zerami. Minimalna szerokość 0, 2 miejsc po przecinku).

"%6.2lf", 0.123 ->__0.12 (wypełniona spacją szerokość min. 6, 2 miejsca dziesiętne).

"%06.2lf", 0.123 ->000.12 (wypełniona zerami szerokość min. 6, 2 miejsca dziesiętne).

"%0.6lf", 0.123 ->0.123000 (szerokość min. 0, 6 miejsc dziesiętnych).

Pierwsze zero określa dopełnienie zerowe, a następnie minimalną szerokość, która ma domyślną wartość 0. W związku z tym jest ona skutecznie ignorowana sama przez siebie (ponieważ nie można ustawić szerokości 0).


Nawiasem mówiąc, prawidłowa forma jest %f nie %lf dla printf.

+0

Podczas gdy jesteśmy przy tym, reguła promocji całkowitej (patrz C11, 6.5.2.2.6) wymusza rzutowanie wartości zmiennoprzecinkowej na "podwójne". Oznacza to, że zarówno 'float', jak i' double' osiągają 'printf' jako' double', a zatem '% f' i'% lf', oba oczekują 'double' i dlatego są takie same. Dlatego też nigdy nie widzisz '% hd', ponieważ działa dokładnie tak samo jak'% d'. Dodatkowo, dlatego nie musisz rzutować znaku na int, jeśli jest podane '% d'. Uwaga boczna: to nie jest to samo dla 'scanf', ponieważ' char * 'na przykład nie jest promowane na' int * '! – Shahbaz

+0

@Shahbaz - jako punkt boczny, tak. Jeśli dobrze pamiętam, '% lf' jest dozwolone w C99, ale' l' jest całkowicie ignorowane - chociaż% lf może powodować problemy dla starszych kompilatorów. – teppic

Powiązane problemy