printf,即格式化输出,是C语言中常用的输出函数。本节内容咱们就来讲讲关于这个函数的一些用法。
我们在《第一个C语言程序》中有粗略地提到了printf函数,小伙伴们应该也对这个函数有了一个大致的了解,大概知道了是用来输出数据用的。但是,我们既然说它是个函数,那么就应该有挺多丰富的用法等着我们来发掘。那我们就一起来看看到底有哪些方法。
初窥门径
我们还是从那个最简单的C语言程序开始:
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
printf函数有个括号,那么这个函数的所有参数都是放在这个括号里面的。什么意思呢,printf这个函数就像是一个工具,这个工具有许许多多的功能。如何去设置这个工具,让它达到我们想要的效果,就只需要把我们的想法写在括号里就完事儿啦。
但是呢,这个工具并没有搭载目前最新最火的人工智能,比如你这么写
printf(让"Hello, world!\n"这个东西给劳资居中)
,这样肯定不行,因为printf看不懂呀。只有写出它看得懂的东西,它才会听话,乖乖给我们工作。你要是说些它听不懂的,那它就直接罢工不干啦,你就跟老板解释去吧!(printf:别说人话了,我听不懂)
正式开始
既然想要函数听懂我们在说什么,就要遵循它的方式。那么我们先来了解下printf的通式:
printf(输出框架*格式化设置,附加参数)
参数解析
-
输出框架
我们上面那个
printf("Hello, world!\n")
中,就只用到了输出框架这一个参数。有的小伙伴可能会问了,我们看到的全部内容不就是引号里面的吗?咋叫框架呢? 其实不然,我们还只用了一个参数,别急,后面大家就知道啦。
-
格式化设置
这个星号其实是没有的,这里只是告诉大家这两个参数之间是连接起来的,不需要空格。
此处的语法通式为:
%[标志] [宽度] [精度] [长度修饰符] 转换字符
其中,带中括号的是可选参数,不带的是必选参数。
-
转换字符:
字符 含义 c char;字符 d int;带符号的十进制整数 i 同上 e double;以指数形式输出单、双精度浮点数 E 同上 f double;以小数的形式输出单、双精度浮点数(指数显示小写e) g double;以%f或%e中较短的一种方式输出单、双精度浮点数(指数显示小写e) G 同上,指数显示大写E o unsigned int;无符号八进制(无前导0) s char;字符串 u int;无符号十进制 x unsigned int;无符号十六进制(无前导0x) X 同上(无前导0X) p void;指针值 n int;用于存放已写字符的个数到变量,不用于输出 % 不进行参数转换;%本身 -
标志:
标志 含义 - 指定被转换的参数在其字段内左对齐(默认是右对齐) + 给数加上正负号 [空格] 若非负数则加上空格 0 对于数值转换,当输出长度小于字段宽度时,添加前导0补充 # 指定另一种输出方式
1. 若转换字符为o,则第一个数为0
2. 若转换字符为x或X,则在输出的非零值前加0x或0X
3. 对于转换字符为e、E、f、g或G,则输出的数总包含一个小数点。
另外,对于转换字符g或G,还将尾部无意义的0保留 -
宽度:
转换后的参数输出宽度至少达到这个值,若不足则在左边或右边填补空格或者0。具体看标志的设置,若无,默认左边填充空格。
-
精度:
这里要声明一下,只有这个参数前面是要加点号"."来分隔的,
对于字符串,它指定打印的字符的最大个数。
对于整数,它指定打印字符的位数,必要时加0来填补。
对于转换字符为e、E或f,它指定打印的小数点后的数字位数。
对于转换字符为g或G,它指定打印的有效数字位数。
-
长度修饰符:
修饰符 含义 hh 按signed char或unsigned char类型输出 h 按short或unsignedshort输出 l 按long或unsigned long输出 ll 按long long或者unsigned long long输出 L 按long double类型输出
-
-
附加参数
所谓附加参数,笔者也不做过多解释。假设我有一个变量c,在
int c=3
之后,我想要输出c的值,该怎么办呢?有的小伙伴很聪明,立马说,Harris!我知道,这样不就行了:
#include <stdio.h> int main(void) { int c=3; printf("C=3\n"); return 0; }
是的,这样做没错。我们的确正确输出了整型变量c的值。但是,我们写程序,很多时候时为了方便不懂程序的人来使用的。我们知道c的值,那是因为我们看得懂代码。
如果我要你输出刚才用户输入的值,你怎么办呢?那么这个时候,附加参数就大显神威了。
#include <stdio.h> int main(void) { int c=3;//这里假定用户已经输入了值 printf("C的值为%d",c); return 0; }
看到了吧。这里就把动态的变量c嵌入到语句里面输出了。
看到这里我相信小伙伴们应该也明白了为啥我之前说引号里面的是框架了。这就是所谓的格式化输出,是不是有点只可意会不可言传的感觉呢?
今天的内容基本就到这里结束啦。不过Harris在这里给大家留个悬念,大家可以自己回去自己的编译器上实验一下,看看能不能理解输出的结果?具体原理以后会讲,所以不理解没关系,学好上面的内容就很棒啦!
#include <stdio.h> int main(void) { char C = 'c'; printf("%c=%d",C,C); return 0; }