输出输入函数详解资料.docx
《输出输入函数详解资料.docx》由会员分享,可在线阅读,更多相关《输出输入函数详解资料.docx(31页珍藏版)》请在冰豆网上搜索。
输出输入函数详解资料
一、预处理指令——文件包含
(1)作用:
提供给用户的一批用于实现常见功能的函数。
(2)格式:
#include<文件名.h>或#include"文件名.h"或#include"文件名.c"或#include"文件名.c"
(3)补充:
a)要调用函数,必须拥有此函数相应的代码,以及函数声明。
若被调用函数在主调函数上方,则函数声明可以省略。
C语言将功能相近的库函数作为一类,并且整理成一个文件,只要书写相应代码。
在“编译”的预处理阶段,会用该文件包含的函数代码进行替换,用户只需选择相应的文件以及会使用该文件内的函数即可,不必重新编写相应代码。
b)用户也可以将功能相近的函数作为一类,整理成相应的文件。
c)使用C语言整理库函数形成的文件规定用“h”结尾,使用用户整理函数形成的文件用规定“c”结尾,不能为其它,否则报错。
d)末尾不能加“;”,这不是C语句组成之一,否则报错。
e)不能使用不存在的文件名,否则报错。
f)“""”与“<>”的区别:
将文件内包含的函数代码替换文件包含,首先要找到该文件。
使用“""”,从包含此代码的源文件所在的目录开始查找;使用“<>”,从C语言整理库函数形成的文件所在的目录开始查找。
为了提高“编译”效率,使用文件包含时要合理选择。
g)C语言提供的库函数多种多样,而且不同的软件也对C语言提供的库函数进行扩充。
因此,本文会在相应的地方介绍一些常用的库函数以及使用方式,并且和一些使用方式极其简单的函数整理成附录B。
h)文件包含一般写在代码的最上方,这样可以不用书写函数声明,减少工作量。
(4)举例:
如stdio文件中包含许多实现输出输入的函数,是实现人机互动的关键,所组成的C语句称为输出语句和输入语句。
下面介绍几种最常用的输出输入函数。
二、输出函数
(1)由printf函数构成的输出语句:
a)作用:
输出相应的结果。
有多种使用格式,这里只介绍最常用且不易出错的。
b)格式:
printf(格式控制,输出列表)
c)举例:
格式上不易理解,先以一个简单的输出语句为例,再补充。
代码:
结果:
d)补充:
i.使用printf函数时需书写相应的文件包含,如:
“#include”或“#include"stdio.h"”,否则报错。
ii.printf函数是int型函数,使用方式为函数调用,输出成功时,返回值为输出字符的个数。
否则,返回值为负数,一般只有高级程序员才会对返回值进行分析。
iii.格式控制的本质是字符串。
包含普通字符以及格式说明字符,对于普通字符进行原样输出,格式说明字符被输出列表相应的值替换后再输出,若输出列表的值的数据类型与相应的格式说明字符代表的数据类型不符,则将输出列表的值自动转换成其数据类型与相应的格式说明符代表的数据类型相等的中间值,用中间值对格式说明字符进行替换输出。
iv.格式说明字符以“%”开头,后面紧跟着格式字符,常用的有以下几种:
种类
说明
c
输出值对应的字符
s
输出字符串
hd、d、ld、ldd
输出有符号短整型、基本整型、长整型、双长整型的十进制数
hu、u、lu、llu
输出无符号短整型、基本整型、长整型、双长整型的十进制数
ho、o、lo、llo
输出无符号短整型、基本整型、长整型、双长整型的十进制数对应的八进制数,不带前缀0
#ho、#o、#lo、#llo
输出无符号短整型、基本整型、长整型、双长整型的十进制数对应的八进制数,带前缀0
hx、x、lx、llx或hX、X、lX、llX
输出无符号短整型、基本整型、长整型、双长整型的十进制数对应的十六进制数,不带前缀0x或0X,用x时输出字母为小写,用X时输出字母为大写
#hx、#x、#lx、#llx或#hX、#X、#lX、#llX
输出无符号短整型、基本整型、长整型、双长整型的十进制数对应的十六进制数,带前缀0x或0X,用#x时输出字母为小写,用#X时输出字母为大写
f、lf、llf
以小数形式输出单精度、双精度、双长精度浮点数。
整数部分全部输出,小数默认输出六位
e或E
以指数形式输出浮点数,用e时输出指数为e,用E时输出指数为E
%
输出一个%
v.上面例子的输出过程如下:
在格式控制中寻找格式说明,将输出列表的值按照格式说明的要求进行替换,若数据类型相等,直接进行替换,否则自动转换成数据类型相等的中间值进行替换,再全部输出。
变量a,b都为int型变量,即有符号的基本整型变量,和输出要求的数据类型一致,用与其值相等的十进制数进行替换,不必自动转换,其余原样输出。
vi.输出列表由带有值的对象组成,各个对象以“,”隔开,否则报错。
vii.格式控制中格式说明的数量(除了“%%”)可以小于输出列表中值的个数,对于没有对应到的值不给予输出,如下:
代码:
结果:
格式控制中的格式说明只有两个,分别对应输出列表的变量a和b,而输出列表的变量c无格式说明与之对应,不给予输出,“,”进行原样输出。
viii.格式控制中格式说明的数量(除了“%%”)可以大于输出列表中值的个数,但是会得到莫名其妙的结果,如下:
代码:
结果:
因此,在使用时,最好保证格式控制中格式说明的数量与输出列表中值的个数相等,而且值的数据类型与相应的个格式说明的数据类型也应相等,这样使用最规范。
ix.格式控制中可以没有格式说明(除了“%%”),用来实现一些提示,如下:
代码:
结果:
x.格式控制中可以出现转义字符,输出转义字符对应的字符,但是对于不能通过相应的按键直接打出的非正常字符,则输出它相应的功能,如:
输出“\n”会换行,输出“\t”相当于输出4个空格。
如下:
代码:
结果:
xi.尽量不要在输出列表中改变输出变量的值,否则会造成输出结果的不确定。
如下:
代码:
结果:
对于输出列表的值,是按照从右至左的顺序进行扫描的,在扫描第一个值a=a+2时已经改变了变量a的值,因此最后输出结果为1010,而不是810。
格式控制中两格式说明之间的空格原样输出。
xii.值对格式说明进行替换时,不仅可以原样替换,还可以控制替换时的样式。
数据类型
操作
整型
在“%”和格式字符间加上一个正整数“n”代表输出数据宽度
(1)n小于实际宽度,自动突破,原样替换。
(2)n大于实际宽度,加上空格补充。
(3)n为右对齐,-n为左对齐。
浮点型
(一)
在“%”和格式字符间加上正整数“n1.n2”代表指定宽度,n1代表输出数据宽度(包括小数点),n2代表小数点后小数位数。
(1)n2小于小数位数,进行四舍五入。
(2)n2大于小数位数,添加0。
(3)n1小于n2加上整数位数和小数点,自动突破,原样替换。
(4)n1大于n2加上整数位数和小数点,加上空格补充。
(5)n1.n2为右对齐,-n1.n2为时为左对齐。
浮点型
(二)
(1)在“%”和格式字符间加上正整数“.n2”,限制输出的小数部分,按上面
(1)
(2)进行。
(2)当n2为0时,不输出小数和小数点。
(3).n2为右对齐,-.n2为左对齐
(4)float和double的有效数字为6和15位,如以“%.50lf”输出50位小数时,系统只能保证前15位为正确的,后面的不能保证。
字符与字符串型
在%和格式字符间加上一个正整数“n”代表输出数据宽度,用法和整数型一样。
xiii.举例:
列举几种常见的输出情况并给予分析。
1.未自动突破时的右对齐与左对齐:
未自动突破时,值按照满足格式说明所要求的值,进行控制替换输出,更加美观。
代码:
结果:
分析:
变量a和变量b的值符合要求,不给予自动转换。
十进制下值的长度为1,输出指定长度为4,未超过,用空格给予补充,输出时为右对齐,空格补充在值前面,值在右边。
上图数字8和3前面各有三个空格。
若在输出指定长度前面添加“-”,则进行左对齐,如下:
代码:
结果:
分析:
数字8和3后面都带有三个空格,也可以一个左对齐一个右对齐,如下:
代码:
结果:
分析:
数字8前面与数字3后面都带有三个空格,但是显示结果使用户认为是83。
所以对于未自动突破下的左对齐或右对齐,要进行统一使用,或者在格式说明之间加上普通字符进行原样输出以便用户区分。
2.自动突破:
若自动突破,则无论左对齐或右对齐都无效,值按照满足格式说明所要求的值,进行原样替换输出。
代码:
结果:
分析:
变量a和变量b的值符合要求,不给予自动转换。
在十进制下值的长度都为4,输出指定长度为2,超过,进行自动突破,用1000替换%-2d,用2000替换%2d,最终输出结果为10002000。
3.浮点数的四舍五入
代码:
结果:
分析:
变量a的值符合要求,不给予自动转换。
要求输出小数长度为2,小于小数位数,对第三位小数进行四舍五入。
输出3.15。
若要求输出小数长度大于小数位数,则添0补充。
如:
变量a的值为3.1时,输出结果为3.10。
4.输出字符串的本质:
代码:
结果:
分析:
格式控制为“%s”,输出列表为“你好”,都是是字符串常量,字符串常量的值由第一个字符所在的存储空间的地址决定,运用“%s”进行输出时,会从此地址开始,依次输出每个字符,直到遇到“\0”(结尾标志)为止,便停止输出,“\0”不输出,若字符串常量中有“\0”,输出时会发生“截断”,如下:
代码:
程序:
5.利用变量指定输出长度:
代码:
结果:
分析:
前面例子都是用具体的数字控制输出长度,若将数字改成“*”,会以输出列表的值代替此“*”动态控制输出长度,若其值不为整型,则进行自动转换,用中间值进行代替。
若能熟练地控制值输出的样式,会使程序运行结果十分美观,反之,在格式说明之间加上普通字符进行原样输出也能让用户进行区分,但操作复杂,综合上面的讨论,现在用算法描述输出语句进行处理时的步骤,前提条件是输入语句无语法错误且规范。
S1:
执行输出语句,依次处理输入语句中格式控制的对象。
S2:
获取处理对象,若为普通字符,转S3,否则,转S4。
S3:
输出普通字符,若格式控制对象处理完毕,转S5,否则转S2。
S4:
将输出列表中相对应的值按照格式说明的要求进行替换并输出(%%除外),若格式控制对象处理完毕,转S5,否则转S2。
S5:
输出语句执行完毕。
执行下一句C语句,若无,程序运行结束。
(2)由putchar函数构成的输出语句:
a)作用:
使可执行程序运行时,输出对应的字符。
b)格式:
putchar(值)
c)补充:
i.putchar函数为int型函数,使用方式为函数调用。
输出成功时,返回值为该字符对应的ASCII码,若出错,返回值为-1,一般只有高级程序员才会对返回值进行分析。
ii.若值不为整型,则进行自动转换,输出中间值对应的字符。
iii.putchar函数一次只能输出一个字符,若要输出多个字符,多书写几句,或者用printf函数输出多个字符或字符串。
d)举例:
代码:
结果:
分析:
值为97.6,自动转换为整型,直接取整数部分,不会四舍五入,输出中间值97对应的字符,即'a'。
putchar(值);相当于printf("%c",值);,是一种简写形式,使用方式十分简单,不易出错。
三、输入函数
(1)由scanf函数构成的输入语句:
a)作用:
可执行程序运行时遇到输入语句,执行框会有闪烁的光标提示用户输入数据,以输入回车符(敲回车键)代表输入结束,用于给变量赋值。
也有多种使用格式,这里只介绍最常用且不易出错的。
b)格式:
scanf(格式控制,输入列表)
c)举例:
同样的,格式上也不易理解,先以一个简单的输入语句为例,再补充。
结果:
程序与分析:
可执行程序运行时,从main函数其函数体开始运行,执行第4行,声明语句,定义变量a,执行第5行,输入语句,光标进行闪烁提示用户输入数据,如下:
在用户敲下回车键后会将数据进行传送,回车符也会一起传过去,系统根据所得到的数据对变量进行赋值。
如:
可从键盘上输入50。
此处代表回车符,可用回车键进行输入。
第一行的50是用户输入的结果,在敲下回车键后,光标进行换行,传送数据50。
将50赋值给变量a,第5行执行完毕,执行第六行,输出变量a的值,在第二行输出50。
d)补充:
i.scanf函数的格式控制,本质是字符串,和printf中的格式控制一样。
也分为普通字符和格式说明字符。
格式说明字符以“%”开头,后面紧跟着格式字符,常用的有以下几种
种类
说明
组成部分
c
读取一个字符
任意字符
s
读取字符串
见下文
hd、d、ld、lld
读取有符号短整型、基本整型、长整型、双长整型的十进制数
“0~9”、“-”、“+”
hu、u、lu、llu
读取无符号短整型、基本整型、长整型、双长整型的十进制数
“0~9”
ho、o、lo、llo
读取无符号短整型、基本整型、长整型、双长整型的十进制数对应的八进制数
“0~7”,不用输入前缀
hx、x、lx、llx或hX、X、lX、llX
读取无符号短整型、基本整型、长整型、双长整型的十进制数对应的十六进制数
“0~9”、“a(A)~f(F)”,不用输入前缀
f、lf、llf
读取单精度、双精度、双长精度浮点数,输入可用小数形式或指数形式
“0~9”、“e或E”、“.”、“-”、“+”
ii.输入数据缓冲区:
用于存放用户输入数据的区域。
用户在敲下回车键后,相关内容可看成以没有结尾标志的字符串进入输入数据缓冲区,光标自动换行。
如上输入50后,输入数据缓冲区如下:
5
0
系统会根据格式控制中的要求从第一个字符开始读取,若能获取到合理的值,则赋给输入列表中相应的变量。
当输入数据缓冲区被读取完毕后,若输入列表中还有变量未被赋值,则光标继续闪烁,提示用户继续输入数据。
读取规则大致如下:
对于数值型数据,以数字字符(属于组成该类数值的字符)开始到空白字符(空白字符:
可执行程序中不会显示的字符,代表着相应的作用,有:
空格符(间隔),回车符(换行)制表符(通过tab键输入,相当于4个空格符)或非数字字符结束;对于字符型数据,只读取一个字符;对于字符串,以非空白字符开始到第一个空白字符结束。
iii.用户在敲下回车键之前,可以用退格键(Backspac)对数据进行修改,防止出错。
iv.取地址运算符——&
1.作用:
获取变量对应的存储空间的地址。
2.格式:
&变量
3.种类:
单目运算符
4.要求:
出现在右边的只能是变量,否则报错。
5.补充:
利用输入语句或是赋值语句对变量进行赋值操作时,需要获取相应的地址。
在赋值语句中,左值被自动处理成相应的地址。
而在输入语句中,则需要利用取地址运算符获取相应的地址,才能对变量进行赋值操作。
6.举例:
可利用printf函数输出变量对应的存储空间的地址,如下:
代码:
结果:
分析:
变量a对应的存储空间的地址在十进制下为2293324。
变量在分配存储空间时,必须先找到能满足需求且处于空闲状态的一段电子器件,然后改变这些电子器件的状态,以开头第一个电子器件的地址作为变量的地址。
因此,对于未赋值的变量,不仅其值具有随机性,连对应的存储空间的地址也有随机性。
补充:
再次对源文件编译运行后,发现结果没有变化。
这里的随机性是指,对于不同的源文件,即使内容一样,但是内部各个变量对应的存储空间的地址以及初始值都不一样,甚至在不同计算机上编译运行同一个源文件,上述也有随机性。
v.举例:
通过输入情况以及输出结果进行详细分析。
1.单个整型数的简单输入:
代码:
程序运行与分析:
执行第3行的输入语句,光标闪烁提示用户输入数据
直接敲下回车键,光标进行换行,输入数据缓冲区如下:
格式控制是“%d”,读取有符号的基本整型十进制数,以“0~9”、“-”、“+”为组成部分,输入数据缓冲区从第一个字符开始扫描判断,以数字字符开始到空白字符或非数字字符结束,读取不到数值型数据,清空。
仍继续闪烁提示用户输入数据,再次输入,输入数据缓冲区如下:
3
<空格符>
5
0
0
输入数据缓冲区从第一个字符开始扫描判断,以数字字符开始到空白字符或非数字字符结束,将3作为有符号的十进制数赋给变量a,后面的空格符为空白字符,结果如下:
在将3赋值给变量a后,输入数据缓冲区更改如下,若再次遇到输入语句,会继续按照要求读取,当输入数据缓冲区被读取完毕后,若输入列表中还有变量未被赋值,则光标闪烁,提示用户继续输入数据。
程序运行结束后,也会对输入数据缓冲区清空,释放其存储空间。
<空格符>
5
0
0
读入数值(整型和浮点型)时,若数据缓冲区开头若干位为空白字符,进行无视。
如下:
输入数据,数据缓冲区如下:
<空格符>
<空格符>
<制表符>
1
2
3
执行输入语句,格式控制是“%d”,读取有符号的基本整型十进制数,此时数据缓冲区开头三位为空白字符,进行无视,此时数据缓冲区相当于,同理进行:
1
2
3
2.单个整型数的复杂输入
代码:
程序运行与分析:
输入数据,输入数据缓冲区如下:
A
格式控制是“%x”,无符号的十六进制数值型数据,以“0~9”、“a(A)~f(F)”为组成部分,输入数据缓冲区从第一个字符开始扫描判断,以数字字符开始到空白字符或非数字字符结束,将A作为无符号的十六进制数赋给变量a,即将无符号的十进制数10赋值给变量a,后面的回车符为空白字符,对于“%o”则以“0~7”作为组成部分,结果如下:
这里变量a为无符号的整型变量,是为了与所赋数值在数据类型上保持一致,更加规范,避免意想不到的情况发生。
不过人们在编程时存储整型数据时最常用的为int型,因此,输入整型数据时常用的格式控制为“%d”。
这里只是介绍一下其余情况,做个补充。
3.单个字符的输入
代码:
程序运行与分析:
输入数据,输入数据缓冲区如下:
1
!
~
格式控制中第一个是“%c”,是字符型数据,输入数据缓冲区从第一个字符开始扫描判断,只读取一个字符,最终将1作为字符赋给变量a,输入数据缓冲区更改如下:
!
~
对于字符变量的输入十分简单,注意也是字符,相当于‘\n’。
4.短整型、长整型、双长整型、单精度、双长精度数的输入
对于短整型、基本整型、长整型、双长整型八进制、十进制、十六进制数以及单精度、双长精度的浮点数,在输入时不必加后缀进行区分,只要范围合理并且规范即可。
由系统给予自动转换。
若超越范围,则发生“截断”现象。
代码:
结果:
分析:
输入数据,输入数据缓冲区如下:
1
0
L
不读取后缀,将10L(由10自动转换而来)赋给变量a。
输入数据缓冲区更改如下:
L
将L赋给变量c,输入数据缓冲区更改如下:
输出变量a和变量c,程序运行结束,清空输入数据缓冲区并释放变量。
5.带有普通字符的输入
C语言规定,输入时,若格式控制有普通字符,则输入数据时,必须在相应位置上有该字符,否则会得到错误的结果。
代码:
结果:
分析:
输入数据,数据缓冲区如下:
.
.
.
1
0
在输入语句的格式控制中遇到“%d”之前有三个连续的“.”,必须先从数据缓冲区读取三个连续的“.”后,才能开始读取有符号整型十进制数。
读取普通字符后,数据缓冲区更改如下:
1
0
将10赋给变量a,数据缓冲区更改如下:
输出变量a的值,程序运行结束,清空数据缓冲区并释放变量。
输入语句的格式控制中有普通字符时,若读取有误,会导致赋值结果不正确。
如下:
6.单个浮点数的输入:
代码:
结果:
程序运行与分析:
输入数据,输入数据缓冲区如下:
3
.
1
4
浮点型数据读入较复杂,为说理清晰,采用if-else语句描述以小数形式进行输入的读取过程,对于指数形式的读取方式,本文不做探讨。
if(先读取到有符号整型十进制数m(由“0~9”、“-”、“+”组成))
{
m作为整数部分
if(整数部分后面紧跟着‘.’且后面紧跟无符号整型十进制数n)
{
n作为小数部分
if(n的长度大于有效数字的位数)
对小数部分四舍五入,进行赋值
else
用m.n对进赋值
}
else
用m进行赋值
}
elseif(先读取到‘.’、‘-.’、‘+.’且后面紧跟无符号整型十进制数n)
{
n作为小数部分
if(n的长度大于有效数字的位数)
四舍五入,进行赋值
else
用0.n或-0.n进行赋值
}
else
用0进行赋值
注意,上述赋值时,还有自动转换的过程,以小数形式输出浮点数时,小数部分默认输出前六位,不足时,添0补充。
7.单个字符串的输入:
C语言没有字符串变量,对于字符串的输入,见第九章。
以非空白字符开始到第一个空白字符结束。
读入字符串时,若数据缓冲区开头若干位为空白字符,进行无视。
8.多个值的输入
上面介绍的输入语句只读入单值,不易出错。
但多个变量都需要赋值时,书写多句会显得代码冗杂,因此有必要掌握含有多个值的输入语句的使用方法,就像含有多个字的输出语句一样。
下面讨论时未考虑混有字符串型的,但是相信读者在看完本节与第九章后自己不难得出规律。
1)多个数值型的输入
对于多个数值型的输入,必须使用恰当的手段分隔各个数值,避免系统当成一个整体进行读入,有两种方法:
输入语句的格式控制中带有普通字符,输入数据时运用空白字符。
代码:
结果:
分析:
输入数据,数据缓存区如下:
1
0
0
,
2
0
0
,
3
.
1
4
输入语句的格式控制为“%d,%d,%lf”,从前往后依次处理,首先处理“%d”,读取有符号整型十进制数,从数据缓冲区中读取100赋给变量a,数据缓冲区更改如下:
,
2
0
0
,
3
.
1
4
再处理“,”,从数据缓冲区中读取一个“,”,数据缓冲区更改如下:
2
0
0
,
3
.
1
4
再处理“%d”,同理下去,当输入数据缓冲区被读取完毕后,若输入列表中还有变量未被赋值,则光标闪烁,提示用户继续输入数据,直至变量全被赋值,输入语句执行完毕。
在实际应用时,要有良好界面提醒用户,否则极易出错,完善后代码如下:
当然也可以用别的符号作为分隔,甚至不用符号做分隔。
代码:
结果:
分析:
输入数据,数据缓冲区如下:
-
3
空格符
1
0
制表符
3
.
1
4
输入语句的格式控制为“%d%d%lf”,从前往后依次处理,首先处理“%d”,读取有符号整型十进制数,从数据缓冲区中读取-3赋给变量a,数据缓冲区更改如下:
空格符
1
0
制表符
3
.
1
4
若开头若干个字符为空白字符,在读取数值时,进行无视,但是读取字符时不一样,因为空白字符本身也是字符,能赋给