Jaka jest różnica między specyfikatorami konwersji% i a% d w sformatowanych funkcjach IO (* printf / * scanf)

Odpowiedzi:

276

Są takie same, gdy są używane jako dane wyjściowe, np printf. Z.

Jednak różnią się one, gdy są używane jako specyfikator wejściowy, np. Z scanf, gdzie %dskanuje liczbę całkowitą jako liczbę dziesiętną ze znakiem, ale %idomyślnie jest to liczba dziesiętna, ale pozwala także na wartości szesnastkowe (jeśli poprzedza je 0x) i ósemkowe (jeśli poprzedza je 0).

Tak 033byłoby 27 z, %iale 33 z %d.

Bagnet
źródło
8
Oczekiwanie, że int z możliwym uzupełnieniem zerowym w sscanf wydaje mi się najbardziej rozsądnym domyślnym zachowaniem. Jeśli nie spodziewasz się Octal, może to powodować subtelne błędy. Sugeruje to, że% d jest dobrym specyfikatorem do użycia, gdy musisz wybrać dowolnie, chyba że chcesz wyraźnie odczytać ósemkę i / lub szesnastkę.
Eliot
2
Ach! To ma sens! Teraz, gdy wiem, czego szukać, można to również zobaczyć w dokumentacji dla printfi scanf.
Gabriel Staples
67

Są identyczne, printfale różne dla scanf. Dla printfzarówno %di %iwyznacza liczbę całkowitą ze znakiem dziesiętnym. For scanf, %da %itakże oznacza liczbę całkowitą ze znakiem, ale interpretuje dane wejściowe jako %iliczbę szesnastkową, jeśli jest poprzedzone przez, 0xi ósemkowe, jeśli jest poprzedzone, 0i inaczej interpretuje dane wejściowe jako dziesiętne.

Jason
źródło
20

Nie ma różnicy między specyfikatorami %ii dla %dformatu printf. Widzimy to, przechodząc do projektu standardowej sekcji C99. 7.19.6.1 Funkcja fprintf, która obejmuje również printfspecyfikatory formatu i mówi w paragrafie 8 :

Specyfikatory konwersji i ich znaczenie to:

i zawiera następujący punkt:

d,i     The int argument is converted to signed decimal in the style
        [−]dddd. The precision specifies the minimum number of digits to
        appear; if the value being converted can be represented in fewer
        digits, it is expanded with leading zeros. The default precision is
        1. The result of converting a zero value with a precision of zero is
        no characters.

Z drugiej strony, ponieważ scanfistnieje różnica, %dzałóż bazę 10, podczas gdy %iauto wykrywa bazę. Możemy to zobaczyć przechodząc do sekcji 7.19.6.2 Funkcja fscanf, która obejmuje scanfw odniesieniu do specyfikatora formatu, w paragrafie 12 mówi:

Specyfikatory konwersji i ich znaczenie to:

i obejmuje:

d     Matches an optionally signed decimal integer, whose format is the
      same as expected for the subject sequence of the strtol function with
      the value 10 for the base argument. The corresponding argument shall
      be a pointer to signed integer.

i     Matches an optionally signed integer, whose format is the same as
      expected for the subject sequence of the strtol function with the
      value 0 for the base argument. The corresponding argument shall be a
      pointer to signed integer.
Shafik Yaghmour
źródło
4

Nic nie ma printf- oba są synonimami.

SS Anne
źródło
6
Istnieje różnica, gdy jest używana w scanf()formacie ciągu, jak mówi zaakceptowana odpowiedź.
J ... S