admin 管理员组文章数量: 1184232
2024年3月26日发(作者:info怎么读)
维普资讯
・
开发研究与设计技术・ 本栏目责任编辑:谢媛媛
浅析C语言中sca nf()函数的用法
陈晓男
(江南大学信息工程学院.无锡科技职业学院,江苏无锡214028)
摘要:C语言中scanfn函数非常重要,充分了解它的用法就更加重要。
关键词:scanfn
中图分类号:TP31 1 文献标识码:A 文章编号:1009—3044(2007)19—40144—02
CHEN Xiao-nan ’
Analyze the Use of the Function Scanf()in C Programming Language Simply
fSouthern Yangtze University School ofln ̄rrnadon Technology,Wuxi Professional CoHege ofScience and Technology,wu)(i 214028,China)
Abstracts:The function scanf0 is very important in C programming language.It is more importnta tO master the user of the function..
Key words:scanf0
1引言
scanfn函数的用法在C语言中是非常重要的,但是很多初学
值之间用空格隔开。若输人格式字符之间没有分隔符,则可用空
格.TAB或回车作间隔。因为C编译在碰到空格,TAB,回车或其
他非法数据f如对“%d”输入“12A”时,A即为非法数据)时即认为
该数据结束
者对于该函数的用法总是会遇到这样或那样的错误.作为这门课
的教授者,于是萌发了写这篇文章的念头。文中结合本人在学习
和编程中对它的认识和体会.以具体实例阐述问题,目的在于使
得初学者能够正确使用scanf0 ̄数.少走不必要的弯路。
3 scanf(、函数用法说明
fl1对于字符串数组或字符串指针变量,由于数组名和指针变
量名本身就是地址,因此使用scan 函数时,不需要在它们前面加
上”&”操作符
2 scanf()函数简介
scanfn函数是格式化输入函数,它从标准输入设备(键盘)读
取输入的信息
scanf0函数的一般格式为:
scanf(“输人格式”。<输入项表>1:
格式化字符串包括以下两类不同的字符:
2.1格式化说明符:
表1 scanf() ̄
格式字符
例如:
void main0
{char S-”This is a dog.";
char t s:
char c[201;
prinff(”%s\Il”,s);
S— :
(%<格式字符>)
说明
d|
x,
输入帝符号的十进制整数(正数可帝符号)
输入帝符号的几进制整数(可输入前导符0)
输入帝符号的十六进制整数(可输入前导符ox)
输入一个字符
输入字符串(第一个菲空白字符至I下一个空白字符)
.
scanf(”%s”,s);
scanf(”%s”,t);
printf(”%s、Il”,s);
printf(”%s\Il”,【);}
(2)根据表2可知,在使用scanf0函数时可以在格式化字符串
中的”%格式字符”之间加入~个整数.表示输入数据时所占据的
位数
如上例中若规定只能输入l0字符给字符串指针s,则第一条
f,e,丘晶  ̄iA'J、数或指数形式实数
输入无符号的十进制整数
输入指针地址
2.2附加格式说明符
表2 scanf()F ̄g的格式字符(%<附加格式说明字符><格式字符>)
宇符
士 读入数据,但不赋值
说明
scanf0函数语句变为:scanf(”%10s”,s);
程序运行时一旦输入字符个数大于10,s就不再继续读人,
而后面的一个读人函数即scanff”%s”。t)就会从第11个字符开始
读人。
具体结果如下:
This is a dog.
1,Z
h
正整数,输入数据所占宽度
表示10ng或double
表示short 一
Thisisacat.thec(输入项)
Thisisacat
.
输入项表是需要读人的所有变量的地址,而不是变量本身,
这一点要特别注意。各个变量的地址之间用”,”分开。
例如:
#include<stdio.h>
thec
f31scanf0函数中没有精度控制。
如:sca叫”%5. ・,&a);是非法的。不能企图用此语句输入小数
为2位的实数。
void main0
{int i,j;
(4)scanf中要求给出变量地址.如果给出变量名则会出错。
prlnff(”i,j=?\rI”);
scanf(”%d,%dll,&i,&j);
printf(” %d'j=%d、Il”,i'j);)
上例中。因输人格式字符之间用”。”分隔.则在输入时用”,”将
输入的值隔开。若输人格式字符之间的分隔符为空格.则在输入
时要用一个或多个空格将输入的值隔开。即,若将scan %d,%
如scanf(”%d”,a);是非法的,应改为scnaf(”%d”,&a);才是合法
的。
(5)在输入字符数据(%c)时,若格式控制串中无非格式字符,则
认为所有输入的字符均为有效字符。
例如:scanf(”%c%c% ,&a,&b,&c);
输人为:x Y Z
则把,x 赋予a,,(空格) 赋予b,,v 赋予c。
d”,&i,&j);改为:scanf(”%d% &i,&j);则在输入时,输人的值与
收稿日期:2007—09—16
作者简介:陈晓男(1973一),女,江苏省常州人,讲师,江南大学信息工程学院在读硕士,研究方向为计算机技术。
144 电脑知识与技术
维普资讯
本栏目责任编辑:谢媛媛
只有当输入为:xyz时,才能把,x 赋于a/y 赋予b, z 赋予
C。如果在格式控制中加入空格作为间隔,
・ 开发研究与设计技术・
问题2:输入变量时忘记加地址运算符“&”。
int a.b:
如scanf(’’%c%c%c“,&a,&b,&c);则输入时各数据之间可加
空格。
我们用一些例子来说明一些规则:
#include<stdio.h>
scanff”%d%d..,a’b1;
答复:
这是不合法的。scanf()i ̄i数的作用是:按照a、b在内存的地址
将a、b的值存进去 “&a”指a在内存中的地址。
解决的方法:
void main0
{char a,b;
printf(”Please input a,b\n..1:
scanf(”%c%c”,&a,&b); 注意两个%c之间没有任何符号 /
prinff(”%c%c\n”,a,b);)
如下是在上述程序输入x Y后所得到的输出结果
Please input a,b
在输入源程序代码时要尽量仔细
问题3:输入数据的方式与程序中的要求不相符。
(1)scan ̄”%d%d”,&a,&b);
输入时.不能用逗号作两个数据间的分隔符.如下面输入不
合法: 、
3.4
XY(输入项)
X
由于scanf函数”%c%c”中没有空格.输入x Y.结果输出只
输入数据时.在两个数据之间以一个或多个空格间隔.也可
用回车键。跳格键tab
有x。而输入改为XY时则可输出XY两字符,结果如下:
Please input a,b
xY(输入项)
XY
(2)scanf(”%d,%d”,&a,&b);
C语言规定:如果在“格式说明符”字符串中使用了格式说明
符以外的其它字符将格式说明符分隔.则在输入数据时应输入与
这些字符相同的字符将输入的值隔开。针对上述语句,下面输入
是合法的:
3.4
如果将上述例子中的scanf(”%c%c”,&a,&b);改为scanf(”%c%
c”
,
&a,&b);
则上述结果应该变成如下情况:
Please input a,b
XY(输入项)
XY
此时不用逗号而用空格或其它字符是不对的
3 4 3:4
Please input a,b
又如:
xY(输入项1
XY 、
scan ̄”a:%d,b:%d”,&a,&b);
输入应如以下形式:
a=3,b=4
本例表示scanf格式控制串”%c%c・・之间有空格时.输入的数
据之间可以有空格间隔.但如果没有空格.仍然可以得到预期的
结果。
问题4:输入输出的数据类型与所用格式说明符不一致。
例如.a已定义为整型.b定义为单精度实型
a=3;b=4.5:
4常见的错误及相应对策
问题1:
程序的运行的结果与预期的不一样
样include<stdio.h>
prinff(”%f%dkn”,a,b);
编译时不给出出错信息.但运行结果将与原意不符。这种错
误尤其需要注意
问题5:在输入数据时.企图规定精度。
void main()
{static int a[21131=({1,3,4),{7,9,6】】;
int i,j,k;
for(k=l;k<:2:k++1
{pfinff(”Please input num:\n”); .
scanf(”%d%d”,&i,&j);
if(i<2&&i<31
scanf(”%7.2P’ &a1:
这样做是不合法的.输入数据时不能规定精度。
问题6:在不应加地址运算符&的位置加了地址运算符。
例如已知str是一个一维字符型数组。有以下语句:
scanf(”%s”.&sty;
C语言编译系统对数组名的处理是:数组名代表该数组的起
始地址.且scafif函数中的输入项是字符数组名。不必要再加地址
prinff(”num:%d\n”,a[im]);
else
prinff(”Input is error,\n”);)
e program is complete.\n”);)
prinff("th
.。
符&。应改为:scanff”%s”.str);
但这种错误在编译时并不会出错.而且也能够正常执行.只
是运行结果不对,这一点在使用时一定要注意。
我想将第9行改为
scanf(”i_%d j=%d..,&i,&j);
则程序运行结果变成:
lease inputP nun:
问题7:scanf0能不能用在单精度实型的数组中?
#include<stdio.h>
i=l 2(输入项)
nun--6
lease iPnput num:
nun--6
the program is complete.
void main0
{float a172J[2J;
inti;
.
f0r :0:i<2Ij++1
为什么第二次不能输入?
答复:
scanff”%P’,&a【i】[i】);
for(i=0;i<2;i++1
使用Turbo C 2.0确实存在这样的问题。象scanf(”i_%d j:%
d.I,翻,&j);这样的输入方式比较特别,在TC 2.0中,第一次输入后
没有清除输入缓冲区.这样第二次执行scanf时.程序没有要求输
入.而是直接读入上次输入的结果
解决的方法:可在scanf0 ̄前加上:
fflush(stdin);
这样可清除掉键盘缓冲区。
printf”% ,a【i][i]);
prinff(”\n”);}
该程序编译通过。但运行时出错.错误是:
scanf:floating point formats not linked
・
Abnormal program termination
答复:
其实在Turbo C中二维实型数组元素不能直接通过scanf0i ̄
(下转第162页)
\ 开发研究与设计技术
例:某病人一次住院,按规定记录次数应为25次.其中有2
项记录超过标准.评分数学模型计算.该病历时限质量应扣除10
分.时限分数为90分
本栏目贲任编辑:谢媛媛
确认,通过眼观、手动、心智的过程,反复给临床医师予以提醒
维普资讯
新方法、新技术,以及高干病人行手术、特殊检查治疗等,必须报
医务部(处、科)或院领导批准。”等。而且,每项提示操作者都必须
目前.我国病历管理处在由传统病历管理模式向现代化病历.
模式转变的过渡时期.虽然计算机信息技术在病历管理中得到了
一
5系统功能
电子病历书写质量控制系统主要功能:f11监控功能。控制系
统自动采集指标体系中的30项数据.持续在线跟踪.实时显示各
定程度的应用,但“重管轻用”思想的束缚并未得到根本解决。
项记录的起止时间、剩余时间、完成时间和超时时间 f2)预警功
能。控制系统根据采集的数据与标准时限对照.得出病历书写过
病历信息仍然处于“数据多、信息少”的局面,医院信息管理人员
缺乏将数据转化为信息.将信息转化为决策与政策的能力。将分
析病历所得信息介入院长行政查房的一些做法.取得了实际的收
程参数.给予医师在线提醒,根据某项记录的起止时间、剩余时
间。指导医师应及时完成哪些记录,哪些记录应先完成.哪些记录
益.进一步说明了深入开发利用病历信息资源为管理决策服务的
重要性。
可后完成 同时.系统还设定警报线。当规定的时限还剩余8小
时.系统自动闪烁报警.以强化提醒。此外,还利用各种与病人诊
断、检查、处置等密切相关的监控信息,为医师提供实时性辅助提
示 f31反馈功能 控制系统以每个病人的信息为单元,应监控的项
目数量是多少。按时完成的数量是多少,超时完成的数量是多少,
建立信息自动分析系统.可以使医院信息人员得到及时有效
的信息分析结果.满足对医学教研活动的实时监测与控制.发挥
统计的咨询、监督与预测功能.同时改进与丰富现有的统计分析
方法.让管理人员直接参与信息的分析预测活动.促进医院的管
超时未完成的数量是多少。超时的项目是哪些等.按医师个人、科
室和全院分三类进行质量统计.找出影响时限质量的症结 f41评
分功能 控制系统以每份病历为单元.根据评分数学模型自动评
分,评分采取百分制 ,f51智能判别功能。控制系统采用逻辑关系判
理工作进入科学化、整体化和系统化的新阶段。
参考文献:
『11樊石.电子病历的特点及管理『J1.中华医院管理杂志,2003,
断方法.自动判别不同病情、不同阶段,各种记录之间错综复杂的
唯一关系、优先关系、等同关系、替代关系、并列关系和等级关系
等,从中准确找出最适当的记录及其规定时限。例如.首次上级医
师查房记录、抢救记录、手术记录、转科记录、转入记录、交班记
(4):225—227.
『21唐维新.病历书写基本规范『M1.东南大学出版社,2002.
『31薛万国,谢秀林.医生工作站及其设计 .计算机系统应用,
1998,(4):9一l1.
[4]Kenneth N Barke,PhD,Elizabeth A Flynn,et a1.Medication
Errors observed in 35 Health Care Facilitjes,(REPRINTED)ARCH
录、接班记录、出院记录及死亡记录均属唯一记录,必须单独完
成,其他记录不能等同或替代 同一时间段内.上级医师的查房记
录可替代除唯一记录之外的其他记录:任何一项病程记录均等同
于一次Et常病程记录;交(接)班记录、转科记录可替代阶段小结;
术后病程记录和抢救记录可替代除唯一记录之外的其他记录:首
次病程记录可替代同耕的病重、病危病程记录:当有术后病程记
录和抢救记录、转科记录、转入记录、交班记录、接班记录同时存
在时.相互不能替代.应分别记录,等等。
INTERN MED[J],American Medicl aAssociation,2002,162(9).
[5]Jana Zvarova,Amost Vesely,Petr Hanzlicek1.On Direct Com-
paring of Medical Guidelines with Electronic Health Record[J].Lec-
ture Notes in Computer Science,2004(309):1 1 33.
『61罗晓沛.数据库技术『M1.清华大学出版社,1999.
『71f美)Mark Graves.XML数据库设计『M1.机械工业出版社,
20o2.
『81吴伟斌,肖强.电子病历系统的研究与开发『J1.中华医院管
理杂志.2004.(4):204—206.
『91陈浩,王敏,刘彤.新技术在电子病历中的应用『C1.第九届全
6在线监控信息是辅助临床医师降低医疗缺陷的
有效措施
利用各种与病人诊断、检查、处置等密切相关的监控信息。为
医师提供实时性帮助指引。例如.病人人院一周仍未确诊,控制系
统立即提示:“请及时组织疑难病例讨论或会诊”:当下达了某种
药物过敏的医嘱.每当开医嘱时,控制系统立即提示,“病人对某
种药物过敏”:当下达手术医嘱.控制系统立即提示一组手术前准
国医药信息学大会CMIA.02论文集.2002:68—72.
『101刘伟力,郭惠,于建国.医院信息系统的发展趋势『J1.医疗设
备信,1999,(1).
[1 1]Charles Safran,Howard Goldberg.Electronic patient records
and the impac t of the Intemet[J].International Journal of Informatics
Medical,2000,60:77—83.
备相关信息:“①组织术前讨论了吗?②书写术前小结了吗?③手
术同.意书签字了吗?④备血及输血同意书签字了吗?⑤手术需要
审批吗?⑥麻醉同意书签字了吗?⑦冰冻切片病理检查同意书签
字并预约了吗?⑧是否还有特殊术前准备需要做?”当下达特殊诊
疗操作医嘱.控制系统立即提示一组特殊诊疗操作准备相关信
[12]Seth M Powsner,Jeremy Wyatt,Patircia Wright.Opportunities
for and challenges of computerization[JJ.THE ANCET,1998,352(1 1):
1617-1621.
『131陈玮,陆达.视频元数据全文检索系统的研究与实现『J1.情
息:”①特殊诊疗操作同意书签字了吗?②特殊诊疗操作需要审批
吗?③与相关医技科室预约了吗?④是否还有特殊准备需要做?”
等.并同步提示有关医疗工作要点.如术前提示医师:“病情特重
患者、可能致残或死亡的手术、本院首次开展的新手术、疑难杂症
或术前未定术式的
f上接第145页1
报学报,2004.23(1):32—35.
『131张涛.基于分布对象技术扩展Web应用程序的功能『J1.福
州大学学报:自然科学版.2000.28f31:ll一14.
『141冯大亮,林李柏.21世纪我国医院信息系统的展望『J1.医学
信息.1998.11.
等应术前讨论”:“凡首次开展的较复杂的
决方法.也可以采用其他函数和方法来更好地解决.但本文仅限
讨论scanf0函数本身 文中难免存在一些不足之处.欢迎各位读者
给予批评指正
数输入.这一点在C语言的相关书籍中基本就没有提到过。但这
种情况也不是没有办法使用,如果在scanf(”%ft,&a[iJ[i]);前面加上
如下语句:
lfoat f:
参考文献:
『11谭浩强.C程序设计『M1.清华大学出版社,1991,7:42—44.
scanf(”%f.,&f);
程序还是能够得到预期结果的
5结束语
本文主要讲述了C语言中的scanff1函数的用法,文中某些解
1 62 毫脑知识与技术
[2]刘模群.Turbo C中几个应该注意的问题》[JJ《常州工学院
学报)2005.18(21:54
[3](scanf 0函数的用法和实践》http://virus.blog.51cto.com/
5 1437/2 1 395.2007—03
版权声明:本文标题:浅析C语言中scanf()函数的用法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1711384336a591505.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论