
C语言scanf函数应用问题.docx
5页C语言scanf函数应用问题 c语言的输入是由系统供应的库函数完成的scanf函数是c语言中最常用且功能最强的输入函数,但该函数如使用不慎,就会出现错误或得不到预想的结果以下结果都是基于Vc++6.0运行环境 一、格式说明符和输入项的三对应(类型、个数、顺序)scanf函数格式中的格式说明(“%格式字符”)应与输入项数据类型全都,个数相等、顺序对应(除格式说明中出现“*”附加格式说明字符外)示例一:inta,b;scanf("%d%d%d",printf("%d,%d",a,b);输入“345”时,输出“3,4”,没有错误提示信息,但是第三个数没有接收的变量,也就没有输出再如inta,b;scanf("%d",printf("%d,%d",a,b);输入“34”时,输出“3,-858993460”,a得到3,但b是一个随机数,都是因为格式说明(“%格式字符”)与输入项个数不全都造成的再如structst{intnum;charname[10];intage;floatscore;}student;scanf("%d,%s,%d,%f",输入“10001,"zhang",23,68”,运行程序时,无出错信息,但student不能正确接收输入数据。
应当写成:scanf("%d,%s,%d,%f",保证格式说明与输入项个数相等、一一对应,才能使student正确接收输入数据示例二:chara,b;scanf("%d%d",printf("%d,%d",a,b);输入“34”时,输出“3,4”,输入整型数据,是字符型数据接收,但是结果正确,因为字符型数据在内存中的存放形式是整型数据再如floata,b;scanf("%d%d",printf("%d,%d",a,b);输入“34”时,输出“0,918028288”,即a和b的结果都是随机数,这就是输入格式和接收的数据类型不一样造成的又如:inta,b;scanf("%f%f",printf("%d,%d",a,b);输入“1.23.4”时,输出“1067030938,1079613850”,即a和b的结果都是随机数,这也是输入格式和接收的数据类型不一样造成的 二、非格式说明符的输入非格式说明符要求用户原样照写输入,既不能更改,又不能漏写示例一:inta,b;scanf("a=%d,b=%d",printf("%d,%d",a,b);输入“12”(即1、2间用空格隔开),输出“-858993460,-858993460”,无错误提示,但结果与输入数据不全都,输出a、b的值是随机数。
这就是因为scanf函数中设定的格式(“a=%d,b=%d”)(其中a=,b=均为平凡字符)与输入数据的格式(1、2间用空格间隔)不全都造成的,正确的输入形式应为“a=1,b=2”(“,”也绝不能漏掉)所以,为了保证正确输入数据,输入数据前首先看好程序中scanf函数设定的格式,再根据设定的格式正确输入数据示例二:scanf("%d,%d",输入时应用以下形式:3,4↙留意3后面应是逗号,它与scanf函数中的“格式掌握”中的逗号对应假如输入时不用逗号而用空格或其他字符是不对的3□4↙(不对)3:4↙(不对)假如是scanf("%d□□%d",则输入时两个数据间应空两个或更多个空格字符如:3□□4↙或3□□□□4↙ 三、附加格式说明符的说明示例一:inta,b;scanf("%2d%2d",printf("%d,%d",a,b);输入“1234”,输出“12,34”输入“123”,输出“12,3”输入“123456”,输出“12,34”因为格式中“d”格式字符表示输入整型数据,“2”附加格式说明字符表示输入数据所占宽度为2,因此,无论用户输入什么,系统都将自动截取两位赋给a,再截取两位赋给b。
也就是说可以用附加格式说明符指定输入数据所占列数,系统将自动按它截取所需数据 再如scanf("%3c",假如从键盘上连续输入3个字符abc,由于ch只能容纳一个字符,系统就把第一个字符‘a’赋给ch示例二:floata;scanf("%5.1f",输入“1234”,无错误提示,但a并不能接收输入数据,输出a的值为随机数,再尝试输入别的数据,结果都为随机数用户本意想用这样的scanf格式输入宽度为5位,小数部分为1位的小数,但得不到预想结果因为,scanf函数中只有“域宽”(此处为5)附加格式说明字符(指定输入数据所占列数),而没有在“小数位数”附加格式说明字符(只有printf函数有),应当去掉“.1”,即scanf("%5f",scanf("%f",输入“123.4”,输出x的值为随机数,没有接收输入的数据,再输入别的数据,结果都为随机数这是因为用户定义x为双精度型数据,而用“%f”格式输入数据时,不能接收,应当使用“%lf”或“%le”,即scanf("%lf",scanf("%2d,%*3d,%2d",输入“12,345,67”,此时,12赋给a,67赋给b留意:原则上“,%格式字符”应与“输入项”(printf("%c%c",a,b);输入A□B↙,输出A□‘,A’给了字符变量a‘,□’作为合法字符给了字符变量b。
这时我们改用scanf("%c%*c%c",输入A□B↙,输出AB,‘A’给了字符变量a‘,□’被%*c跳过‘,B’就给了字符变量b可见,使用scanf函数时,要在scanf规定的格式字符及其附加格式说明字符下使用既不能不用,又不能滥用 四、留意输入结束标志①遇到空格,或者回车键,或者tab键假如相邻两个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分开,或者用tab键分开,或者输入一个数据后,按回车,然后再输入下一个数据在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入示例一:scanf("%d%d",假设给num1输入12,给num2输入36,则正确的输入操作为:12□36↙或者:12↙36↙示例二:scanf("%c%c%c",假如从键盘输入a□b□c↙则字符‘a’赋给c1,字符‘□’赋给c2,字符‘b’赋给c3因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔空格,因此空格作为下一个字符赋给c2 故应当从键盘输入abc↙②遇到输入域宽度结束例如“%3d”,只取3列示例一:scanf("%3d",假如从键盘输入12345↙,则num1的值为123。
③遇到非法输入例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)示例一:scanf("%d%c%f",若输入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前必需加地址符scanf("%s",这也是错误的因为数组名表示数组的起始地址,已经指出输入数据的位置了,再使用地址符&即成为二级指针,意义截然不同,应改为charc[10];scanf("%s",c);因此,scanf函数中的“格式掌握”后面只要写成指针型(一级指针)数据指出输入数据所在的位置即可,不能机械搬用,要明的确际含义。












