1、C语言scanf函数应用问题 C语言的输入是由系统提供的库函数完成的。scanf函数是C语言中最常用且功能最强的输入函数,但该函数如使用不慎,就会出现错误或得不到预想的结果。以下结果都是基于VC+6.0运行环境。 一、格式说明符和输入项的三对应(类型、个数、顺序)scanf函数格式中的格式说明(“%格式字符”)应与输入项数据类型一致,个数相等、顺序对应(除格式说明中出现“*”附加格式说明字符外)。示例一:inta,b;scanf(“%d%d%d”,&a,&b);printf(“%d,%d”,a,b);输入“345”时,输出“3,4”,没有错误提示信息,但是第三个数没有接收的变量,也就没有输出。
2、再如inta,b;scanf(“%d”,&a,&b);printf(“%d,%d”,a,b);输入“34”时,输出“3,-858993460”,a得到3,但b是一个随机数,都是因为格式说明(“%格式字符”)与输入项个数不一致造成的。再如structstintnum;charname10;intage;floatscore;student;scanf(“%d,%s,%d,%f”,&student);输入“10001,”zhang”,23,68”,运行程序时,无出错信息,但student不能正确接收输入数据。 应该写成:scanf(“%d,%s,%d,%f”,&student.num,studen
3、t.name,&student.age,&stu-dent.score);保证格式说明与输入项个数相等、一一对应,才能使student正确接收输入数据。示例二:chara,b;scanf(“%d%d”,&a,&b);printf(“%d,%d”,a,b);输入“34”时,输出“3,4”,输入整型数据,是字符型数据接收,但是结果正确,因为字符型数据在内存中的存放形式是整型数据。再如floata,b;scanf(“%d%d”,&a,&b);printf(“%d,%d”,a,b);输入“34”时,输出“0,918028288”,即a和b的结果都是随机数,这就是输入格式和接收的数据类型不一样造成的。又
4、如:inta,b;scanf(“%f%f”,&a,&b);printf(“%d,%d”,a,b);输入“1.23.4”时,输出“1067030938,1079613850”,即a和b的结果都是随机数,这也是输入格式和接收的数据类型不一样造成的。 二、非格式说明符的输入非格式说明符要求用户原样照写输入,既不能更改,又不能漏写。示例一:inta,b;scanf(“a=%d,b=%d”,&a,&b);printf(“%d,%d”,a,b);输入“12”(即1、2间用空格隔开),输出“-858993460,-858993460”,无错误提示,但结果与输入数据不一致,输出a、b的值是随机数。这就是因为s
5、canf函数中设定的格式(“a=%d,b=%d”)(其中a=,b=均为普通字符)与输入数据的格式(1、2间用空格间隔)不一致造成的,正确的输入形式应为“a=1,b=2”(“,”也绝不能漏掉)。所以,为了保证正确输入数据,输入数据前首先看好程序中scanf函数设定的格式,再按照设定的格式正确输入数据。示例二:scanf(“%d,%d”,&a,&b);输入时应用以下形式:3,4注意3后面应是逗号,它与scanf函数中的“格式控制”中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的。34(不对)3:4(不对)如果是scanf(“%d%d”,&a,&b);则输入时两个数据间应空两个或更多个空格
6、字符。如:34或34 三、附加格式说明符的说明示例一:inta,b;scanf(“%2d%2d”,&a,&b);printf(“%d,%d”,a,b);输入“1234”,输出“12,34”输入“123”,输出“12,3”输入“123456”,输出“12,34”因为格式中“d”格式字符表示输入整型数据,“2”附加格式说明字符表示输入数据所占宽度为2,因此,无论用户输入什么,系统都将自动截取两位赋给a,再截取两位赋给b。也就是说可以用附加格式说明符指定输入数据所占列数,系统将自动按它截取所需数据。 再如scanf(“%3c”,&ch);如果从键盘上连续输入3个字符abc,由于ch只能容纳一个字符,
7、系统就把第一个字符a赋给ch。示例二:floata;scanf(“%5.1f”,&a);输入“1234”,无错误提示,但a并不能接收输入数据,输出a的值为随机数,再尝试输入别的数据,结果都为随机数。用户本意想用这样的scanf格式输入宽度为5位,小数部分为1位的小数,但得不到预想结果。因为,scanf函数中只有“域宽”(此处为5)附加格式说明字符(指定输入数据所占列数),而没有在“小数位数”附加格式说明字符(只有printf函数有),应该去掉“.1”,即scanf(“%5f”,&a);或scanf(“%f”,&a);均可,此时输入“123.4”即可接收。所以,应根据scanf函数中规定的格式字
8、符及其附加格式说明字符使用,不能滥用,输入数据时不能规定精度。示例三:doublex;scanf(“%f”,&x);输入“123.4”,输出x的值为随机数,没有接收输入的数据,再输入别的数据,结果都为随机数。这是因为用户定义x为双精度型数据,而用“%f”格式输入数据时,不能接收,应该使用“%lf”或“%le”,即scanf(“%lf”,&x);此时输入“123.4”即可接收。 因此长整型数据和双精度型数据必须使用附加格式说明字符l,短整型数据必须使用附加格式说明字符h。示例四:inta,b;scanf(“%2d,%*3d,%2d”,&a,&b);输入“12,345,67”,此时,12赋给a,6
9、7赋给b。注意:原则上“,%格式字符”应与“输入项”(&a,&b)个数相等,一一对应,此处则出现了个数不等的情况(“%格式字符”项数为3,而输入项数为2)。因为scanf函数中有附加格式说明字符“*”,加“*”项表示输入的数据不赋给相应变量,因此输入的“345”被跳过,接收下一个数据(“67”),致使“%格式字符”与“输入项”个数可以不等的情况出现。在利用现成的一批数据时,有时不需要其中某些数据,可用此法跳过它们。例如scanf(“%c%c”,&a,&b);printf(“%c%c”,a,b);输入AB,输出A,A给了字符变量a,作为合法字符给了字符变量b。这时我们改用scanf(“%c%*c
10、%c”,&a,&b);输入AB,输出AB,A给了字符变量a,被%*c跳过,B就给了字符变量b。可见,使用scanf函数时,要在scanf规定的格式字符及其附加格式说明字符下使用。既不能不用,又不能滥用。 四、注意输入结束标志遇到空格,或者回车键,或者Tab键。如果相邻两个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入一个数据后,按回车,然后再输入下一个数据。在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。示例一:scanf(“%d%d”,&num1,&num2);假设给num1输入12,给nu
11、m2输入36,则正确的输入操作为:1236或者:1236示例二:scanf(“%c%c%c”,&c1,&c2,&c3);如果从键盘输入abc则字符a赋给c1,字符赋给c2,字符b赋给c3。因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔空格,因此空格作为下一个字符赋给c2。 故应该从键盘输入abc遇到输入域宽度结束。例如“%3d”,只取3列。示例一:scanf(“%3d”,&num1);如果从键盘输入12345,则num1的值为123。遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。示例一:scanf(“%d%c%f”
12、,&a,&b,&c);若输入1234a1230.26第一个数据对应%d格式在输入1234之后遇到的字母a,因此认为1234之后已没有数字了,第一个数据到此结束,把1234送给变量a。字符a送给变量b,由于%c只要求输入一个字符,因此输入字符a后不需要加空格,后面的数值应送给变量c。如果由于疏忽把本来应为1230.26错打成123o.26,由于123后面出现字母o,就认为该数值数据到此结束,把123送给c。 五、注意输入项scanf函数中的“格式控制”后应当是变量地址,而不是变量名。示例一:intx;scanf(“%d”,&x);该格式中x前必须加地址符&表示x所在的地址,即输入数据所在的位置,
13、如写成intx;scanf(“%d”,x);则出现写内存错误,无法运行.exe应用程序。也有人常在数组名前加地址符&。示例二:charc10;scanf(“%s”,&c);这也是错误的。因为数组名表示数组的起始地址,已经指出输入数据的位置了,再使用地址符&即成为二级指针,意义截然不同,应改为charc10;scanf(“%s”,c);因此,scanf函数中的“格式控制”后面只要写成指针型(一级指针)数据指出输入数据所在的位置即可,不能机械搬用,要明确实际含义。 第 6 页 共 6 页免责声明:图文来源网络征集,版权归原作者所有。若侵犯了您的合法权益,请作者持权属证明与本站联系,我们将及时更正、删除!谢谢!
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100