C语言深入标准输入输出

标准输入输出你吃透了吗?
了解标准输入输出
所谓标准输入输出,我们先理解为通过控制台来输入和显示内容,只要是个操作系统都会有控制台,这是最基本的人机交互方式,后面会详细讲解标准输入输出的概念 。标准输入输出是C语言初学者第一个要越过的门槛,特别是()和scanf()这两个格式化输入输出函数,由于格式定义复杂导致很多人望而却步,其实标准输入输出函数并不是C语言定义的标准,而是stdio库中定义的函数,每个编译器实现不尽相同,但差别不大,掌握它们之后再学习文件的输入输出就很简单了,它们的思路是一样的 。
()
对于格式化输入输出来说,()相对简单,因为没有涉及底层硬件,可以将焦点放在格式定义上,下面一起来看看()函数的定义:
(“格式”, 参数1,参数2…)
如果没有格式控制符,()直接输出内容,例如:(“Hello World\n”),在格式中使用%开头的字母引用后面的变量,称为格式符,格式符是格式输入输出函数的核心,首先来看看整数:
%d十进制整数 %o八进制整数 %x十六进制整数 %u无符号整数
()并未提供八进制和十六进制的有符号输出,也就是说不同进制都是无符号的,另外short用%hd表示,long用%ld表示,long long用%lld表示 long 用lf%表示,如果类型不匹配()会自动进行进行类型转换,转换失败会报错 。通常用%d来输出short和long不会导致错误,但是会出现警告 。%f可以表示单精度和双精度浮点,因为()会设法输出足够的长度,不过养成类型严格匹配是一个好习惯 。浮点默认有效数字为单精度7位,如果是双精度值会被四舍五入,()未提供单独的双精度类型,使用"%lf","%lg"输出精度仍然为7位,但可以通过定义浮点精度解决,格式为%m.nf,m为整数位数,n为小数位数,由于双精度值小数位数不会超过15位,整数不会超过20位,因此20.15%f足以表示双精度 。现在我们使用下面代码输出不同的数值类型:
#includeint main(){short a=1;int b=2;long c=3;unsigned d=4;double e=3.141592654;printf("%hd,%d,%ld,%u,%f,%1.2f,%20.15f",a,b,c,d,e,e,e);return 0;}
bool是新的类型,之前()并未定义,因此使用%d输出,ture输出1,false输出0,下面代码输出bool类型的数值:
#include#includeint main(){bool a=true;bool b=false;printf("a=%d,b=%d",a,b);return 0;}
字符类型使用%c,字符串类型使用%s,使用下面代码测试输出字符和字符串:
#include#includeint main(){char a='a', b='b', c='c';char s[10]="Hello";printf("%c%c%c %s",a,b,c,s);return 0;}
内存地址通常用十六进制表示,而且长度相同,因此()提供了一个新的格式符”%p”,它使用固定的长度输出内存地址,这与某些十六进制文本编辑器显示的结果相同,请看下面的代码:
#include int a=1;int main(){printf("%x\n",&a);printf("%p",&a);return 0;}
显示结果为:
03010
通过%p可以看出是64位系统下的内存地址,因为64位系统使用8个字节标记内存地址,在十六进制中FF值为256,因此两位数表示一个字节,8字节一共16位数字 。其实这里看到的地址也是虚拟地址,并不等于数据在物理内存中的真实地址,虚拟内存地址是现代计算机因内存管理的需要才提出的概念,一个程序的内存实际上由多个物理内存碎片组成,还包括在磁盘中的虚拟内存,虚拟内存使得应用程序认为它拥有连续的内存空间,这样有助于代码调试 。
ANSI C确定了最基本的格式控制符,C99和C11在此基础上增加了一些,所有格式符如下表: