80

我知道这听起来并不高效,但我正在寻找一种方法来记住printf呼叫的所有格式代码。%s, %p,%f都是显而易见的,但我不明白%d从哪里来。已经被%i别的东西占用了?

4

2 回答 2

98

它代表“十进制”(以 10 为底),而不是“整数”。您可以使用%x十六进制(以 16 为底)打印,并%o八进制(以 8 为底)打印。一个整数可以是这些基数中的任何一个。

在中,如果您更喜欢表示“整数”而不是“十进制”,则printf()可以将%i其用作 的同义词,但通常首选它,因为它更具体。%d%d

在输入时, using scanf(),您可以同时使用%i%d%i意味着将其解析为任何基数的整数(八进制、十六进制或十进制,由 a00x前缀表示),而%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使您进入八进制模式这一事实可以赶上您。

于 2012-11-16T01:22:34.747 回答
8

http://en.wikipedia.org/wiki/Printf_format_string似乎说它是十进制的,正如我猜测的那样

d,i

int 作为带符号的十进制数。'%d' 和 '%i' 是输出的同义词,但在与 scanf() 一起用于输入时是不同的(如果数字前面有 0x,则使用 %i 会将数字解释为十六进制,如果前面有 0,则将其解释为八进制。)

于 2012-11-16T01:23:29.810 回答