2012-11-16 15 views
65

Wiem, że to nie brzmi produktywnie, ale szukam sposobu, aby zapamiętać wszystkie kody formatowania dla połączeń printf. %s, %p, %f są oczywiste, ale nie mogę zrozumieć, skąd pochodzi %d. Czy %i jest już zrobione przez coś innego?dlaczego% d oznacza wartość całkowitą?

+18

Moje najlepsze przypuszczenie jest dziesiętne –

+0

Tak, jednak jest to rodzaj ironicznego +1, interesujące pytanie. – Daniel

+0

Choć nie jest to prawdziwe pytanie programistyczne, a ja staram się je zamknąć :) –

Odpowiedz

83

Jest to "decimal" (podstawa 10), a nie "liczba całkowita". Możesz użyć %x, aby wydrukować w hexadecimal (podstawa 16) i %o, aby wydrukować w octal (podstawa 8). Liczba całkowita może być w dowolnej z tych zasad.

W printf(), można użyć %i jako synonim dla %d, jeśli wolisz, aby wskazać „całkowitą” zamiast „po przecinku”, ale %d ogół jest korzystne, ponieważ jest bardziej szczegółowy.

Na wejściu, używając scanf(), można również użyć zarówno %i, jak i %d. %i oznacza przetwarzanie go jako liczbę całkowitą w dowolnej bazie (ósemkowej, szesnastkowej lub dziesiętnej, zgodnie z prefiksem 0 lub 0x), podczas gdy %d oznacza przetwarzanie go jako dziesiętną liczbę całkowitą.

Oto przykład ich wszystkich w akcji:

#include <stdio.h> 

int main() { 
    int out = 10; 
    int in[4]; 

    printf("%d %i %x %o\n", out, out, out, out); 
    sscanf("010 010 010 010", "%d %i %x %o", &in[0], &in[1], &in[2], &in[3]); 
    printf("%d %d %d %d\n", in[0], in[1], in[2], in[3]); 
    sscanf("0x10 10 010", "%i %i %i", &in[0], &in[1], &in[2]); 
    printf("%d %d %d\n", in[0], in[1], in[2]); 

    return 0; 
} 

Tak, należy użyć tylko %i jeśli chcesz podstawy wejściowego zależy od przedrostka; jeśli podstawa wejściowa powinna być stała, powinieneś użyć %d, %x lub %o. W szczególności fakt, że wiodący 0 umieści Cię w trybie ósemkowym, może Cię złapać.

+0

Dziękuję za wyjaśnienie, dlaczego% i działa tak, jak to robi. – clementine

7

http://en.wikipedia.org/wiki/Printf_format_string zdaje się mówić, że jest to dla przecinku jak odgadł

d,i

int jako liczba dziesiętna ze znakiem. '% d' i '% i' są synonimami dla wyjścia , ale są różne w przypadku użycia z scanf() do wprowadzania danych (użycie% i interpretuje liczbę jako szesnastkową, jeśli poprzedza ją 0x, i ósemkowa, jeśli jest poprzedzona 0.)

Powiązane problemy