C语言的调试利器 - printf 大法,无坚不摧,攻无不破

程序输入与输出当我们操作一个linux终端的时候,执行linux命令程序,可以看到命令的输出信息,或者要求输入数据 。那么,这些操作就是linux命令程序与用户进行交互 。程序与用户的交互过程,可以认为是程序的输入与输出过程 。这里我们先介绍程序在终端的输入与输出;当介绍到文件操作的时候,程序可以与硬盘进行输入输出的操作 。
printf函数在编程的过程中,我们需要输出一些有用的调试日志信息,便于跟踪调试程序 。例如,我们想知道在程序运行的过程中,某一个变量的值,某一个内存地址的值,或者提示用户,当前程序正在进行什么工作 。那么,这一切都离不开printf()函数 。
在C语言的库函数中,提供了printf()函数,能够输出多种数据格式,非常有用于调试输出信息 。更高级的使用,可以配合sprintf()或snprintf()函数,可以把数据格式化输出到内存块中,方便快速组合出有用的字符串格式 。
首先,我们来看看printf()函数,如下是一个简单的测试例子:

C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
程序运行的结果如下:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
可以看到,在printf()函数中,把age变量的值给打印出来,让我们可以看到程序里,某一个变量的内容 。此时,我们知道了printf()函数的作用,那么,下面来看看printf()函数的定义格式和各种使用方式 。
2.1 printf函数定义和基本使用【C语言的调试利器 - printf 大法,无坚不摧,攻无不破】C语言提供的printf()函数定义如下:
int printf(const char* format_str, [argument list]);
函数分析:
(1) 参数 format_str 是控制格式输出字符串;
(2) 参数 argument list 是参数列表,该参数是可选参数,不是必须要设置的,可以为空;
(3) 函数的返回值是int类型,是实际打印输出的字符个数;
如下是一个程序测试例子:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
程序运行的结果如下:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
就是只输出一串字符串 。在这个例子中,printf()函数的参数只携带了控制格式输出字符串,不携带参数列表 。所以,它的作用就只是输出一串字符串 。
2.2 printf函数输出格式1 输出字符和字符串格式转换符有:
(1) %c --- 输出一个字符;
(2) %s --- 输出一个字符串;
如下是程序测试例子:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
程序运行的结果如下:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
通过测试例子,可以知道:
(1) %c 格式,把变量a存储的数据当作一个字符输出;
(2) %s 格式,把变量pstr指向的字符串输出;
2 输出有符号和无符号整数格式转换符有:
(1) %d --- 输出有符号数的十进制格式;
(2) %u --- 输出无符号数的十进制格式;
如下是程序测试例子:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
程序运行的结果如下:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
通过测试例子,可以知道:
(1) %d 格式,输出有符号数的十进制格式,例如上面的例子中,把255这个数值存放到a变量,由于a是char类型,只有1个字节的容量 。255表示的二进制是1111 1111,最高位是符号位,符号位为1表示负数 。最终,表示的负数是:数值位取反,得到000 0000,然后,再加1,就得到 000 0001,所以,就是-1这个数值 。
(2) %u 格式,输出无符号数的十进制格式,在上面的例子中,unsigned 指定变量是无符号类型,所以,unsigned char 这个类型表示的1个字节中,没有符号位,一个字节中的8位都是数值位,所以,存放的二进制是 1111 1111表示的数值就是255 。
3 输出十六进制和八进制格式转换符有:
(1) %x --- 输出数值是十六进制格式,是小写字符;
(2) %X --- 输出数值是十六进制格式,是大写字符;
(3) %o --- 输出数值是八进制格式;
如下是程序测试例子:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破

文章插图
 
程序运行的结果如下:
C语言的调试利器 - printf 大法,无坚不摧,攻无不破


推荐阅读