admin 管理员组文章数量: 1087139
2024年3月26日发(作者:echarts地图js下载)
第18卷第6期
长春大学学报
V01.18 No.6
Dec.2oo8
2008年l2月
JOURNAL OF CHANGCHUN UNIVERSITY
文章编号:1009—3907l2008)06—0019一o3
C语言中使用scanf()函数常见问题解析
徐志伟
(长春大学计算机科学技术学院,吉林长春130022)
摘 要:提出了c语言中的scanf()函数在使用过程中的常见问题,分析了问题产生的原因并提出
了解决方法,例如scanf()函数控制串的使用及相关问题等,重点阐明了利用scanf()函数输入多维
数组时遇到问题应如何解决。
关键词:scanf()函数;浮点型;多维数组
中图分类号:TP312C 文献标识码:A
scanf()函数是所有c语言学习者在学习c语言过程中使用最早且使用最为频繁的函数之一,所以
scanf()函数应当是C学习者能熟练运用的一个函数。但有很多初学者对此函数不能很好地运用,在实际编
程中错误使用scanf()函数,导致程序产生某种错误不能运行,这对C语言的学习很不利。
1 Scanf()函数剖析
1.1 Scanf【)函数的控制串
函数名:scanf[1]
功能:执行格式化输人
用法:int scanf(char:}:format[,argument,…J);
Scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘)读取输入的信息。其调用格式为:
Scanf(”<格式化字符串>”,<地址列表>);Scanf()函数返回成功赋值的数据项数,出错时返回EOF.
其控制串由三类字符构成:(1)格式化说明符;(2)空白符;(3)非空白符;
1.2 Scanf()函数的控制串的使用
例1:#include<stdio.h>
main()Printf(”%d,%d\n”,a,b);
{int a,b;
Scanf(”%d%d”,&a,&b);
}运行时按如下方式输入三个值:
3口4/(输入a,b的值)3,4(p6nff输出的a,b的值)
(1).&a、&b中的&是地址运算符,分别获得这两个变量的内存地址;
(2).”%d%d”是按十进制格式输人两个数值。输入时,在两个数据之问可以用一个或多个空格、Tab
键或回车键分隔。
2 Scanf()函数控制串运用出现的常见错误及解决办法
2.1 多维float型数组输入时,程序编译通过,但运行错误提示如下:
Scanf:floating point formats not linked Abnormal program termination
出错示例程序:#include<stdio.h>
收稿日期:2008—10—14
作者简介:徐志伟(1979一),男,吉林省榆树市人,长春大学计算机科学技术学院助教,硕士生,主要从事人工 能 系统_哥发方
法等方面的研究。
长春大学学报 第18卷
main() scanf(”%fII,&s[i][j]);
{int i,j;
lfoat S[3儿3];
for(i-0;i<3;i++)
for(j:0;j<3;j++)
for(i=0;i<3;i++)
for(j=0;j<3;j++)
prinff(”%fIt,s[i][j]);
}
这实际上是编译器的问题。原因很明确[2]:没有浮点链接库。早期系统内存资源紧张,多维浮点数组
占用内存量大(一维浮点数组就没有此问题),因此,TC在编译时尽量不加入无关的部分,在没发现需要浮
点转换程序时,就不在执行程序中安装这个部分。而有时Tc又不能正确识别实际上确实需要做浮点转换。
因此,就会出现上面的错误。
解决的方法:告诉TC需要做浮点数的输人转换。
方法一:lfoat C;Scanf(”%f”,&c);方法二:float C, t;t=&c;即编译器只要有浮点转换的线索,TC就
会把浮点转换连上,所以一般大一点的程序里就会有浮点变量反而没有此问题。
但问题到此并没结束,对于多维浮点数组存在这样的问题,我们可采取如下方式锯决:
#include<stdio.h>
main()
for(j=0;j<3;j++)
scanf(”%f¨,ptr+i¥3+j);
{int i,j;
lfoat S[3][3], ptr;
ptr:&s[0][0];
for(i=0;i<3;i++)
for(i=0;i<3;i++)
for(j=0;j<3;j++)
pfinff(”%7.2f\n”,S[i][j]);
}
这样,我们就把多维浮点数组降为一维浮点数组来处理,调试一下,程序正常运行。
2.2 Scanf()函数不能正确接收有空格的字符串?如:I am here.
#include<stdio.h>
main()
{char sir[80];
scaRf(”%S”,str);
prinff(”%S”,str);
}输入:I am here.输出:I
Scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:[3]
(1)遇空格、“回车”、“跳格”键;(2)遇宽度结束;(3)遇非法输入;
所以,上述程序并没有达到预期目的,Scanf()扫描到“I”后面的空格就认为对str的赋值结束,并忽略后
面“am here.”.这里要注意的是“am here.”还在键盘缓冲区中。我们可以改动一下上面的程序来验证一下:
#include<stdio.h>
main()
{char str[80];
char strl[8O];
char str2[80];
scanf(”%S”,str);/:Ic输入I am here.¥/
prinff(”%S”,str);
sleep(5);/:Ic这里等待5秒 /
scarf(”%S”,str1);/¥
seanf(”%S”,str2);/}
prinff(”\n%S”,str1);
prinff(”\n%s”,str2);
}
第6期 徐志伟:c语言中使用scanf()函数常见问题解析 21
输入:I am here.输出:I amhere.好了,原因知道了。那么scanf()函数能不能完成这个任务?回答是:
能!别忘了scanf()函数还有一个%[]格式控制符,请看下面的程序:
#include”stdio.h”
main()
%[ \n]lI,string);
{char string[50];
%s\n”,string);
/ scanf(”%S”,string);不能接收空格符 /
2.3键盘缓冲区残余信息问题
例:#include<stdio.h> scanf(”%C”,&c);
main()prinff(”a:%d C=%c\n”,a,c);
{int a; / prinff(”C=%d\n”,c);¥/
char C; }while(C!: ,;
do{scanf(”%d”,&a); }
scanf(”%c”,&c);这句不能正常接收字符,什么原因呢?我们用prinff(”c=%d\n”,C);将c用int表
示出来,启用prinff(”c=%d\n”,c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10,ASCII值
为1O是什么?换行即、n.对了,我们每击打一下“Enter”键,向键盘缓冲区发去一个“回车”(、r),一个“换
行”(\n),在这里\r被scanf()函数处理掉了,而\n被scanf()函数“错误”地赋给了C.[4]
解决办法:可以在两个scanf()函数之后加个flfush(stdin);
工
函数名:f
力能:清除一个流用法:i
flush[5]
n mush(F LE s ream);
fn
例
canf
ush(sI
%c
din);
:#jnc】ude<stdio.h>
:&c)
~
;
mush in)
? m prinf(”a:%d c:%c、n”,a,c);
{
n ; }while(c!: ,);
.
char c;
do{scanf(”%d”,&a);
本文对C语言中scanf()函数在使用时容易出现的问题进行了剖析,并从C实际应用角度浅析对此类问题
的处理,能有助于学习者更好的掌握和运用Scanf()函数,为C的进一步学习和精确掌握打下良好的基础。
参考文献:
[1]李丽娟.C语言程序设计教程[M].北京:人民邮电出版社,2008.
[2]E Balagumsamy.PROGRAMMING IN ANSI C THIRD EDITION[M].北京:清华大学出版社,2006.
[3]马保东.C语言程序设计基础[M].天津:南开大学出版社,2006.
[4]王晓东.算法设计与分析[M].北京:清华大学出版社,2005.
[5] 吕凤翥.C+十语言基础教程[M].北京:清华大学出版社,1999.
责任编辑:钟声
An analysis on common problems of using scanf()function in C language
XU Zhi.wei
(Computer Science and Technology Institute,Changchun University,Changchun 1 30022,China)
Abstract:This thesis presents some common problems of using scanf()function in C language,analyzes hte causes and gives the solu-
tions to them,such as the use of scant"()function control stirng and the related issues.It emphatically describes the ways to solve the
problems when scanf()function is used to muhi-dimensional array.
Keywords:scant"()function;floating point;muhi—dimensional array
版权声明:本文标题:C语言中使用scanf()函数常见问题解析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1711386980a591660.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论