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 


本文标签: 输入 记录 信息 数据 病历