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

Jaka jest różnica między %d a %i, gdy jest używana jako specyfikacja formatu w printf?

Author: Sourav Ghosh, 2009-12-12

4 answers

Są takie same, gdy są używane do wyjścia, np. z printf.

Są jednak inne, gdy są używane jako Specyfikacja wejściowa, np. z scanf, Gdzie %d skanuje liczbę całkowitą jako podpisaną liczbę dziesiętną, ale %i domyślnie jest dziesiętna, ale pozwala również na zapis szesnastkowy (jeśli jest poprzedzony 0x) i ósemkowy, jeśli jest poprzedzony 0.

Więc 033 będzie 27 Z %i ale 33 Z %d.

 234
Author: Dipstick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 18:13:17

Są identyczne dla printf, ale różne dla scanf. Dla printf, zarówno %d, jak i %i oznaczają podpisaną liczbę całkowitą dziesiętną. Na scanf, %d i %i oznacza również podpisaną liczbę całkowitą, ale %i odczytuje wejście jako liczbę szesnastkową, jeśli jest poprzedzone 0x i ósemkową, jeśli jest poprzedzone 0, a w przeciwnym razie interpretuje wejście jako dziesiętne.

 64
Author: jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-12 13:59:52

Nie ma różnicy między specyfikatorami formatu %i i %d dla printf. Możemy to zobaczyć, przechodząc do projektu standardu C99 sekcji 7.19.6.1 funkcja fprintf, która obejmuje również printf w odniesieniu do specyfikacji formatu i mówi w akapicie 8:

Specyfikatorami konwersji i ich znaczeniami są:

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 dla scanf istnieje różnica, %d Załóżmy bazę 10, podczas gdy %i Automatycznie wykrywa bazę. Możemy to zobaczyć przechodząc do sekcji 7.19.6.2 funkcja fscanf , która obejmuje scanf w odniesieniu do specyfikacji formatu, w paragrafie 12 pisze:

Specyfikatorami konwersji i ich znaczeniami są:

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.
 16
Author: Shafik Yaghmour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 02:50:33

W tych słowach nie ma żadnego-oba są synonimami.

 8
Author: hqt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 08:21:56