1. printf的基本用法
printf()
的作用是将参数文本输出到屏幕。它的全拼为print
(打印)和format
(格式化),表示可以定制输出的文本。
#include <stdio.h>
int main()
{
printf("Hello World"); //打印
return 0;
}
上⾯命令会在屏幕上输出⼀⾏⽂字“Hello World”。
printf()
不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。
为了让光标移到下⼀行的开头,可以在输出⽂本的结尾,添加⼀个换行符 \n
。
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
如果⽂本内部有换⾏,也是通过插⼊换⾏符来实现,如下⽅代码:
#include <stdio.h>
int main()
{
printf("Hello\nWorld\n"); //这个和下面两个打印完全相同
printf("Hello\n");
printf("World\n");
return 0;
}
printf()
是在标准库的头⽂件stdio.h
定义的。使⽤这个函数之前,必须在源码⽂件头部引⼊这 个头⽂件。
2. 占位符
printf()
可以在输出⽂本中指定占位符。
所谓“占位符”,就是这个位置可以⽤其他值代⼊。
#include <stdio.h>
int main()
{
printf("There are %d apples\n", 3); // 输出 There are 3 apples
return 0;
}
上面示例中,There are %d apples\n
是输出文本,⾥⾯的 %d
就是占位符,表示这个位置要用其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表示占位符的类型,%d
表示这 ⾥代⼊的值必须是⼀个整数。
printf()
的第⼆个参数就是替换占位符的值,上⾯的例子是整数 3 替换 %d 。执行后的输出结果就是 There are 3 apples
。
常⽤的占位符除了%d
,还有 %s
表示代⼊的是字符串。
#include <stdio.h>
int main()
{
printf("%s will come tonight\n", "zhangsan");
return 0;
}
上面示例中, %s
表示代⼊的是⼀个字符串,所以printf()
的第⼆个参数就必须是字符串,这个例子是 zhangsan
。执行后的输出就是zhangsan will come tonight
。
输出文本里面可以使⽤多个占位符。
#include <stdio.h>
int main()
{
printf("%s says it is %d o'clock\n", "lisi", 21); //占位符和参数是对应的
return 0;
}
上面示例中,输出⽂本 %s says it is %d o'clock
有两个占位符,第⼀个是字符串占位符 %s
,第⼆个是整数占位符 %d
,分别对应 printf()
的第⼆个参数 lisi
和第三个参数 21
。两个参数的位置是和占位符对应的,如果参数位置互换,占位符的位置也要互换,执⾏后的输出就是lisi says it is 21 o'clock
。
printf()
参数与占位符是⼀⼀对应关系,如果有n
个占位符,printf()
的参数就应该有 n + 1
个。如果参数个数少于对应的占位符,printf()
可能会输出内存中的任意值。
3. 占位符列举
printf()
的占位符有许多种类,与C语⾔的数据类型相对应。下⾯按照字⺟顺序,列出常⽤的占位 符,⽅便查找,具体含义在后⾯章节介绍。
•%a
:⼗六进制浮点数,字⺟输出为⼩写。
• %A
:⼗六进制浮点数,字⺟输出为⼤写。
• %c
:字符。
• %d
:⼗进制整数。
• %e
:使⽤科学计数法的浮点数,指数部分的e
为⼩写。
• %E
:使⽤科学计数法的浮点数,指数部分的 E
为⼤写。
• %i
:整数,基本等同于%d
。
• %f
:⼩数(包含 float 类型和double
类型)。
• %g
:6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写。
• %G
:等同于 %g
,唯⼀的区别是指数部分的E
为⼤写。
• %hd
:⼗进制short int类型。
• %ho
:⼋进制short int类型。
• %hx
:⼗六进制short int类型。
• %hu
:unsigned short int类型。
• %ld
:⼗进制long int类型。
• %lo
:⼋进制long int类型。
• %lx
:⼗六进制long int类型。
• %lu
:unsigned long int类型。
• %lld
:⼗进制long long int类型。
• %llo
:⼋进制long long int类型。
• %llx
:⼗六进制long long int类型。
• %llu
:unsigned long long int类型。
• %Le
:科学计数法表⽰的long double类型浮点数。
• %Lf
:long double类型浮点数。
• %n
:已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o
:⼋进制整数。
• %p
:指针。
• %s
:字符串。
• %u
:⽆符号整数(unsigned int)。
• %x
:⼗六进制整数。
• %zd
: size_t
类型。
• %%
:输出⼀个百分号。
4. 输出格式
printf()
可以定制占位符的输出格式。
4.1 限定宽度
printf()
允许限定占位符的最⼩宽度。
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123" ,123前面还有两个空格,默认右对齐
return 0;
}
对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。
#include <stdio.h>
int main()
{
printf("%12f\n", 123.45); // 输出 " 123.450000"
return 0;
}
上⾯⽰例中,%12f
表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位,所以 123.45
输出结果的头部会添加2个空格。
4.2 总是显示正负号
默认情况下,printf()
不对正数显⽰+
号,只对负数显⽰-
号。如果想让正数也输出 +
号,可以在占位符的 % 后⾯加⼀个 +
。
#include <stdio.h>
int main()
{
printf("%+d\n", 12); // 输出 +12
printf("%+d\n", -12); // 输出 -12
return 0;
}
上⾯⽰例中, %+d 可以确保输出的数值,总是带有正负号。
4.3 限定⼩数位数
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写成 %.2f
。
#include <stdio.h>
int main()
{
printf("Number is %.f\n, 0.5");
return 0;
}
上⾯⽰例中,如果希望⼩数点后⾯输出3位(0.500
),占位符就要写成 %.3f
。
这种写法可以与限定宽度占位符,结合使⽤。
// 输出为 " 0.50"
#include <stdio.h>
int main()
{
printf("%6.2f\n", 0.5);
return 0;
}
上⾯⽰例中, %6.2f
表⽰输出字符串最⼩宽度为6,⼩数位数为2。所以,输出字符串的头部有两个
空格。
最⼩宽度和⼩数位数这两个限定值,都可以⽤ *
代替,通过printf()
的参数传⼊。
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5); // 等同于printf("%6.2f\n", 0.5);
return 0;
}
上⾯⽰例中,%*.*f
的两个星号通过printf()
的两个参数 6
和2
传⼊。
4.4 输出部分字符串
%s
占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤%.[m]s
指定输出的⻓度,其中[m]
代表⼀个数字,表⽰所要输出的⻓度。
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
上面示例中,占位符%.5s
表示只输出字符串 hello world 的前五个字符,即“hello”。