Почему% d означает Integer?

Я знаю, что это не кажется продуктивным, но я ищу способ запомнить все коды форматирования для вызовов printf. %s, %p, %f все очевидны, но я не могу понять, откуда приходит %d. Является ли %i уже чем-то другим?

Ответ 1

Это означает "decimal" (база 10), а не "целое число". Вы можете использовать %x для печати в hexadecimal (база 16) и %o для печати в octal (база 8). Целое число может быть в любой из этих баз.

В printf() вы можете использовать %i как синоним для %d, если вы предпочитаете указывать "integer" вместо "decimal", но %d обычно предпочтительнее, чем более конкретный.

На входе, используя scanf(), вы можете использовать как %i, так и %d. %i означает синтаксический анализ его как целого в любой базе (восьмеричный, шестнадцатеричный или десятичный, как указано префиксом 0 или 0x), а %d означает синтаксический анализ его как десятичного целого числа.

Вот пример всех из них в действии:

#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;
}

Итак, вы должны использовать %i, если вы хотите, чтобы база ввода зависела от префикса; если исходная база должна быть исправлена, вы должны использовать %d, %x или %o. В частности, тот факт, что ведущий 0 помещает вас в восьмеричный режим, может вас поднять.

Ответ 2

http://en.wikipedia.org/wiki/Printf_format_string, кажется, говорит, что он для десятичного, как я догадался

d,i

int как знаковое десятичное число. '% d' и '% i' являются синонимами для вывода, но при использовании с scanf() для ввода (при использовании% я будет интерпретировать число как шестнадцатеричное, если ему предшествует 0x, и восьмеричный, если ему предшествует 0.)