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 


本文标签: 函数 问题 浮点