1 数据输出
我们之前已经使用过printf()函数来实现数据在控制台上输出
#include
具体的用法是
printf("数据模板",数据1,数据2,...)// 数据模板表示输出数据的形式,里面包含占位符,打印的时候使用具体的数据依次的替换占位符输出结果
现在我们就来具体的说明一下printf函数的用法
主要是两个方面:占位符代表的数据类型和占位符代表的数据格式
1.1 占位符的类型
1.1.1 字符字面量
输出数据的时候要考虑到不同数据的数据类型
一个简单的例子
#include
输出的结果
我们给一个char类型的变量letter赋值97,
如果使用占位符%d输出的话,那么得到的结果是97;
如果使用占位符%c输出的话,那么得到的结果是字符c;
这里的原因就是在c语言当中char类型是用来保存字符的,但是字符数据的保存形式和整数类型的保存形式是一样的,都是把数据以2进制的形式储存到内存当中
具体的工作就是,把数据 97 转换为 2进制数(结果是1100001)
char类型的数据占用的空间大小是 1 个字节相当于 8 位的2进制数,因此上图就是变量letter在内存当中保存的数据
那么在读数据的时候:
使用%d作为占位符,那么原始数据就被解释位整数,转换为 10进制刚好就是97;
如果使用 %c 作为占位符,那么原始的数据就被解释为字符,那么对于字符就需要把数据进行一次翻译
在上表中 2进制 01100001 对应的字符就是 a
对于字符型数据来说储存的形式和整数是一样的,只不过在读取数据的时候需要做一次编码翻译
再看一个例子
#include
把变量的类型改为int,得到的结果是一样的
也就是说 char 类型和 int 类型都是用来保存整数,只不过 char 类型的储存空间比 short int 还要小只有 8 位二进制数(1个字节),那么在输出数据的时候使用占位符来控制输出的是整数还是通过字符编码翻译之后的字符
上面讲的是原理,在实际工作当中,我们不会通过整数来给字符类型赋值(不需要背那张表),通常都会使用字符字面量,把一个字符使用 单引号' 包裹起来
#include
使用 'a' 给 letter 赋值, 'a' 会自动的转换为整数 97,不需要人为的干预,可以理解为编译器自动的帮我们去查字符编码表
#include
使用 int 来处理,结果也是一样的
1.1.2 不能自动转换的情况
再看一个例子
#include
同样的数据,使用不同的占位符输出的结果就不一样
这是因为 %f 会把数据按照浮点数进行输出, %d 会把数据以整数进行输出,而整数和浮点数在内存当中储存的形式是不一样的,所以以 %f 去解析整数类型的数据就会出错
1.1.3 占位符可以代表的数据类型
这里是printf()函数针对不同的数据类型使用的占位符,这里有几个问题需要注意
首先,对于浮点数 float 和 double 在内存当中储存的形式是一样的,所以有时候使用相同的占位符不会出错
#include
使用 %f 和 %lf 输出的结果是一样的
但是 float 和 double 保存的数据精度不同,所以对于精度要求很高的数 %f 和 %lf 就能看出区别了
其次是关于整数数据
整数的表示形式除了 10进制之外,还可以使用 2进制,8进制,16进制
在c语言当中可以
使用 0b开头的整型字面量表示 2进制数;
使用 0开头的整型字面量表示 8进制数;
使用 0x开头的整型字面量表示 16进制数(使用a,b,c,d,e,f代表大于9的数)
#include
%d 会把不同进制的数转换为10进制输出
2进制的 101 -> 10进制的 5;
8进制的 11 -> 10进制的 9;
16进制的 1a -> 10进制的 26;
也可以把10进制的数转为其他进制,或者其他进制相互转换
#include
使用%o占位符输出8进制,%x输出16进制
10进制的数123 相当于 八进制的 173,十六进制的 7b;
为了方便区分不同进制的数,也可以在占位符当中使用#来输出类型前缀
#include
使用%#o,和%#x 更容易看出整数的进制
1.2 占位符控制输出的格式
可以在占位符 % 和表示类型的字母之间加入一些内容来控制数据输出的格式
比如控制输出内容的最小宽度
#include
%<宽度><类型>可以控制输出数据的的最小宽度
也可以控制输出数据的精度
#include
%<.精度><数据类型>可以控制数据输出的精度
完整的格式是
%[旗标][宽度][.精度]<类型>
中括号[] 的内容可以省略,其中:
旗标:可以使用-,+,空格,#
-:表示左对齐;
+:表示在数据前面添加正负号
空格:表示不显示正数的符号,但是使用空格占位
#:表示显示其他进制数据的前缀(0,0x)
精度在浮点型类型的数据表示小数点后的位数,对于正数表示宽度,剩余位置用0补齐对于其他类型的数据表示截取的最大长度
#include
%+.8d表示显示正号,宽度为8,用0补位
2 数据输入
在程序当中除了需要输出数据,还需要获取用户的输入数据
获取输入数据的方法有很多,这里只介绍一个常用的格式化输入函数scanf()
举个例子,计算长方形的面积,需要用户手动的输入长和宽
#include
当程序执行到 scanf() 的时候,会暂停等待用户输入,用户输入完成之后按回车,会自动地扫描用户输入的内容,根据内容的模板来匹配数据,把数据保存到对应的变量地址,这里的 & 表示取地址符,&w 表示变量 w 的地址
结果
sacnf("输入模板",变量地址1,变量地址2,...)
需要注意的是 printf() 后面的参数是变量的值, scanf() 后面的参数是变量的地址,需要加&表示把输入的数据保存到变量的地址中