一、前言
严格来说,printf
这个函数也许并不能算是一个知识点,因为它仅仅只是一个函数而已。
它非常的基础,基本是每个学习C/C++语言的同学第一个使用到的函数。
但同时它也非常的强大,并且其中还蕴含了很多有趣、你以前可能从来没有发觉过的内容。
因此本文想来统一整理一下这个函数的各种用法。
二、基本使用
这个函数是一个可变参数的函数,意思是,它的参数个数是可变的,但至少需要有一个参数,也就是第一个参数。
printf("hello world");
它的作用只有一个:打印字符串到控制台(或者叫终端、标准输出)。
这句话有两个要点,第一个就是字符串。
比如你不能直接打印数字又或者其它类型:
printf(111);
那么想要打印怎么办呢?使用格式化!
这也就是这个函数可变参数的用途,将后面的其它参数,通过格式化的方式,填入前面字符串的指定位置:
printf("hello world,%d",111);
通过在第一个参数中填入特殊的格式化符号%
,我们就能将后面指定的参数内容格式化到这个位置,并且是按顺序一个一个来的。
最后的打印结果为:
hello world,111
从这你也能看出来,格式化的作用,实际上就是将后面的所有可变参数内容转换为字符串,然后按顺序填入指定的位置而已。
这样的格式化符号有很多,比如常见的有:
- %d:数字
- %c:字符
- %s:字符串
- %f:小数
- %X:十六进制数字
- %p:指针
太多了,这里就不继续列举了(大概有十多二十种?)。
而且不仅如此,单单一个%d
,还能有%04d
这种写法,意思就是最少4位数字格式化,不足用0补充。
比如
printf("%04d",1)
的输出就为:0004
有必要记吗?我觉得实在没什么必要。
如果你有相应的输出要求,网上搜一搜就有了,更简单来说,你可以直接问一问ChatGPT嘛。
重点是你要知道:printf
这个函数基本是可以满足你任何输出要求的!如果你觉得不能,那么大概率是你不知道这个用法而已。
一旦有了这种感觉,那么上网搜一搜就行了。
三、输出位置
上面讲解了第一个要点:格式化。
其作用在于将一切变量转换为一定格式的字符串、填入指定的位置,并进行输出。
那么第二个要点就是,输出的位置是哪里呢?一般来说就是我们所看到的控制台(也称黑窗口,终端等)。
可你知道为什么是输出在控制台吗?
这其实和一个宏有关:stdout
这个宏的意思是标准输出(Standard output
),在标准库中被定义为了一个奇怪的函数:
#define stdout (__acrt_iob_func(1))
这个函数到底怎么工作的我们不用管太多,我们唯一需要知道的是,你可以将这个宏看作打开控制台后得到的标识符。
就和打开文件也有一个标识符一样,后面你读写文件时不都是要填那个fopen的返回值的嘛。
也就是说,printf
这个函数默认就是打印到这个宏所指定的终端上的。
既然知道了这一点,那么我们是不是就能更改其打印的位置了呢?比如让它往文件中打印?
当然可以了!这个操作就叫做重定向,可以通过以下函数实现:
freopen("output.txt", "w", stdout);
它的作用就是将标准输出重定向到一个文件中去。
因此它的第一个参数就是你想要打开的文件、第二个参数就是打开的模式(肯定得有写权限才行),然后第三个就是我们要重定向的目标:stdout
因为printf
默认打印的位置就是通过这个宏来指定的,只要我们更改它的指向不就行了吗?这里就是将它重定向到一个文本文件中。
在vs环境下用法如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
FILE *f=freopen("output.txt","w",stdout);
printf("hello world");
fclose(f);
}
最前面的那个宏必须要定义,因为这个函数vs的编译器认为其不安全。
或者你可以使用对应的安全函数freopen_s
就不用定义这个宏了,我这里就不再赘述了。
然后你就会发现,一旦重定向之后,printf
所有输出的内容你都看不到了,因为它全部被打印到了文件中。
四、颜色输出
如果说上面的内容大家都还多多少少知道一些的话,那么这个可能知道的人就相对来说要少得多了。
printf
这个函数还能打印出颜色来?
是的,但这并不是这个函数的功能,而是控制台的功能。
只要你输出一些特定的字符串,控制台就会将这些字符粗转换为对应的颜色、样式。
这种特定格式的字符串被称为:ESCAPE序列
。
具体长下面这样:
\033[0;31m:红色
\033[0;32m:绿色
\033[0;33m:黄色
\033[0;34m:蓝色
如果想要了解更多,可以直接去维基百科查看:ANSI转义序列。
我这里只是想告诉大家有这个东西而已。
这种序列主要可以控制三种内容:文字颜色、文字背景色、文字样式。
比如上面列举的就是控制输出文件颜色的,使用方法如下:
printf("\033[0;31m这是红色的文本\033[0m\n");
printf("\033[0;32m这是绿色的文本\033[0m\n");
这里用到的\033[0m
为清除样式的意思,如果不清除,那么除非被下一个相同的样式覆盖,否则就会一直使用这个颜色。
是不是还很有趣的?
这种序列除了更改文字颜色、文字背景颜色、文字样式外,甚至还能更改当前光标在控制台的位置。
不过很多高级功能并不是所有控制台都支持的,这个得你自己亲自测试过才知道了。
反正总结来说就一句话:如果你想让你控制台程序输出变得更加好看,那么这个ESCAPE序列应该就是你所需要的东西。
通过它,你完全可以打造出非常漂亮的控制台程序。