Я знаю, что это не кажется продуктивным, но я ищу способ запомнить все коды форматирования для вызовов printf
. %s
, %p
, %f
все очевидны, но я не могу понять, откуда приходит %d
. Является ли %i
уже чем-то другим?
Почему% d означает Integer?
Ответ 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.)