格式化输出

printf格式化函数

许多编程语言都使用了C风格格式化输出,所以让我们也尝试一下,编写format-output.c,代码如下:

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>

int main(){
int age = 10;
int height = 72;

printf("I am %d years old.\n",age);
printf("I am %d inches tall.\n",height);

return 0;
}

Makefile文件如下:

1
2
3
4
5
6
CFLAGS=-Wall -g

all: format-output

clean:
rm -rf format-output

执行make,将看到如下内容:

1
2
[root@www practice03]# make
cc -Wall -g format-output.c -o format-output

这段代码量很小,我们逐行分析一下:

  • 首先你包含了一个叫做 stdio.h 的头文件。这告诉你的编译器要使用“标准的输入/输出函数”。他们之一就是下面的printf
  • 然后你声明了一个int类型的age变量,并赋值为10。
  • 接着你又声明了一个int类型的height变量,并赋值为72。
  • 再然后用printf函数来打印你的年龄和身高
  • printf中你会注意到你传入了一个字符串,这就是格式字符串,和其它语言中一样。
  • 在格式化字符串后面,你传入了一些变量,他们应该被printf“替换”进格式化字符串中。

附加题

  • 执行 man 3 printf 来阅读它更多可用的“%”格式的占位符。
控制符 说明
%d 按十进制整型数据的实际长度输出。
%ld 输出长整型数据。
%md m为指定的输出字段的宽度。如果数据的位数小于 m,则左端补以空格,若大于 m,则按实际位数输出。
%u 输出无符号整型(unsigned)。输出无符号整型时也可以用 %d,这时是将无符号转换成有符号数,然后输出。但编程的时候最好不要这么写,因为这样要进行一次转换,使 CPU 多做一次无用功。
%c 输出一个字符
%f 用来输出实数,包括单精度和双精度,以小数形式输出。不指定字段宽度,由系统自动指定,整数部分全部输出,小数部分输出 6 位,超过 6 位的四舍五入。
%.mf 输出实数时小数点后保留 m 位,注意 m 前面有个点。
%o 以八进制整数形式输出,这个就用得很少了,了解一下就行了。
%s 用来输出字符串。用 %s 输出字符串同前面直接输出字符串是一样的。但是此时要先定义字符数组或字符指针存储或指向字符串。
%x(或 %X 或 %#x 或 %#X) 以十六进制形式输出整数,这个很重要。
  • %x、%X、%#x、%#X 的区别

一定要掌握 %x(或 %X 或 %#x 或 %#X),因为调试的时候经常要将内存中的二进制代码全部输出,然后用十六进制显示出来。下面写一个程序看看它们四个有什么区别:

1
2
3
4
5
6
7
8
9
10
# include <stdio.h>
int main(void)
{
int i = 47;
printf("%x\n", i);
printf("%X\n", i);
printf("%#x\n", i);
printf("%#X\n", i);
return 0;
}

在 VC++ 6.0 中的输出结果:

1
2
3
4
2f
2F
0x2f
0X2F

从输出结果可以看出:如果是小写的x,输出的字母就是小写的;如果是大写的X,输出的字母就是大写的;如果加一个#,就以标准的十六进制形式输出。

最好是加一个#,否则如果输出的十六进制数正好没有字母的话会误认为是一个十进制数呢!