<返回更多

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

2021-06-23    峰哥linux编程学堂
加入收藏

程序输入与输出

当我们操作一个linux终端的时候,执行linux命令程序,可以看到命令的输出信息,或者要求输入数据。那么,这些操作就是linux命令程序与用户进行交互。程序与用户的交互过程,可以认为是程序的输入与输出过程。这里我们先介绍程序在终端的输入与输出;当介绍到文件操作的时候,程序可以与硬盘进行输入输出的操作。

printf函数

在编程的过程中,我们需要输出一些有用的调试日志信息,便于跟踪调试程序。例如,我们想知道在程序运行的过程中,某一个变量的值,某一个内存地址的值,或者提示用户,当前程序正在进行什么工作。那么,这一切都离不开printf()函数。

C语言的库函数中,提供了printf()函数,能够输出多种数据格式,非常有用于调试输出信息。更高级的使用,可以配合sprintf()或snprintf()函数,可以把数据格式化输出到内存块中,方便快速组合出有用的字符串格式。

首先,我们来看看printf()函数,如下是一个简单的测试例子:

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

 

程序运行的结果如下:

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

 

可以看到,在printf()函数中,把age变量的值给打印出来,让我们可以看到程序里,某一个变量的内容。此时,我们知道了printf()函数的作用,那么,下面来看看printf()函数的定义格式和各种使用方式。

2.1 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 大法,无坚不摧,攻无不破

 

通过测试例子,可以知道:

(1) %x格式,把变量x存放的数据值,以十六进制格式输出,如果输出十六进制有字母,则以小写格式表示。

(2) %X格式,就是大写的X字母,以十六进制格式输出变量x的值,如果输出的十六进制有字母,则以大写格式表示。

(3) %o格式,是以八进制格式输出数值。

4 浮点数

格式转换符有:

(1) %f --- 以浮点数的格式输出数值,就是带小数点的数据;

(2) %e --- 以科学计数法e的方式输出浮点数;

如下是程序测试例子:

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

 

程序运行的结果如下:

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

 

通过测试例子,可以知道:

(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格式表示,都是相同的值。

5 转移字符

转移字符格式有:

(1) n --- 换行;

(2) t --- 水平跳格,如同按下TAB按键;

(3) r --- 回到当前行的开始位置;

(4) ’ --- 输出单引号;

(5) ” --- 输出双引号;

(6) \ --- 输出一条反斜杠;

如下是程序测试例子:

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

 

程序运行的结果如下:

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

 

其中,注意:

printf("abcwwwr123n");

开始在新的一行输出 abcwww,然后,遇到 r 的时候,回到行的开始位置,就回到字符a这个位置,然后,再输出123,此时,新输出的123字符就把abc字符给覆盖。最终,输出123www这样的字符。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>