20.C语言 printf 函数的多种用法与技巧解析

一、前言

严格来说,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序列应该就是你所需要的东西。

通过它,你完全可以打造出非常漂亮的控制台程序。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux