当我们操作一个linux终端的时候,执行linux命令程序,可以看到命令的输出信息,或者要求输入数据。那么,这些操作就是linux命令程序与用户进行交互。程序与用户的交互过程,可以认为是程序的输入与输出过程。这里我们先介绍程序在终端的输入与输出;当介绍到文件操作的时候,程序可以与硬盘进行输入输出的操作。
在编程的过程中,我们需要输出一些有用的调试日志信息,便于跟踪调试程序。例如,我们想知道在程序运行的过程中,某一个变量的值,某一个内存地址的值,或者提示用户,当前程序正在进行什么工作。那么,这一切都离不开printf()函数。
在C语言的库函数中,提供了printf()函数,能够输出多种数据格式,非常有用于调试输出信息。更高级的使用,可以配合sprintf()或snprintf()函数,可以把数据格式化输出到内存块中,方便快速组合出有用的字符串格式。
首先,我们来看看printf()函数,如下是一个简单的测试例子:
程序运行的结果如下:
可以看到,在printf()函数中,把age变量的值给打印出来,让我们可以看到程序里,某一个变量的内容。此时,我们知道了printf()函数的作用,那么,下面来看看printf()函数的定义格式和各种使用方式。
C语言提供的printf()函数定义如下:
int printf(const char* format_str, [argument list]);
函数分析:
(1) 参数 format_str 是控制格式输出字符串;
(2) 参数 argument list 是参数列表,该参数是可选参数,不是必须要设置的,可以为空;
(3) 函数的返回值是int类型,是实际打印输出的字符个数;
如下是一个程序测试例子:
程序运行的结果如下:
就是只输出一串字符串。在这个例子中,printf()函数的参数只携带了控制格式输出字符串,不携带参数列表。所以,它的作用就只是输出一串字符串。
格式转换符有:
(1) %c --- 输出一个字符;
(2) %s --- 输出一个字符串;
如下是程序测试例子:
程序运行的结果如下:
通过测试例子,可以知道:
(1) %c 格式,把变量a存储的数据当作一个字符输出;
(2) %s 格式,把变量pstr指向的字符串输出;
格式转换符有:
(1) %d --- 输出有符号数的十进制格式;
(2) %u --- 输出无符号数的十进制格式;
如下是程序测试例子:
程序运行的结果如下:
通过测试例子,可以知道:
(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。
格式转换符有:
(1) %x --- 输出数值是十六进制格式,是小写字符;
(2) %X --- 输出数值是十六进制格式,是大写字符;
(3) %o --- 输出数值是八进制格式;
如下是程序测试例子:
程序运行的结果如下:
通过测试例子,可以知道:
(1) %x格式,把变量x存放的数据值,以十六进制格式输出,如果输出十六进制有字母,则以小写格式表示。
(2) %X格式,就是大写的X字母,以十六进制格式输出变量x的值,如果输出的十六进制有字母,则以大写格式表示。
(3) %o格式,是以八进制格式输出数值。
格式转换符有:
(1) %f --- 以浮点数的格式输出数值,就是带小数点的数据;
(2) %e --- 以科学计数法e的方式输出浮点数;
如下是程序测试例子:
程序运行的结果如下:
通过测试例子,可以知道:
(1) %f格式,输出带有小数点的浮点数;
(2) %e格式,以科学计数法e的方式输出浮点数的值,例如上面的例子中,输出:
x1 = 1.250000e+01
根据科学计数法e的表示格式,e字母后面带数值N表示10的N次方。那么,1.250000e+01这个数值中,e字母后面带有数值1,表示10的1次方。所以有:
1.250000e+01 = 1.250000 * 10^1 = 1.250000 * 10 = 12.5
所以对于x这个数值,使用%f, %e格式表示,都是相同的值。
转移字符格式有:
(1) n --- 换行;
(2) t --- 水平跳格,如同按下TAB按键;
(3) r --- 回到当前行的开始位置;
(4) ’ --- 输出单引号;
(5) ” --- 输出双引号;
(6) \ --- 输出一条反斜杠;
如下是程序测试例子:
程序运行的结果如下:
其中,注意:
printf("abcwwwr123n");
开始在新的一行输出 abcwww,然后,遇到 r 的时候,回到行的开始位置,就回到字符a这个位置,然后,再输出123,此时,新输出的123字符就把abc字符给覆盖。最终,输出123www这样的字符。