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”,没有错误提示信息,但是第三个数没有接收的变量,也就没有输出。再如inta,b;scanf("%d",&a,&b);printf("%d,%d",a,b);输入“34”时,输出“3,-858993460”,a得到3,但b是一个随机数,都是因为格式说明(“%格式字符”)与输入项个数不一致造成的。再如structst{intnum;charname[10];intage;floatscore;}student;scanf("%d,%s,%d,%f",&student);输入“10001,"zhang",23,68”,运行程序时,无出错信息,但student不能正确接收输入数据。

应该写成:scanf("%d,%s,%d,%f",&student.num,student.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的结果都是随机数,这就是输入格式和接收的数据类型不一样造成的。又如: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的值是随机数。这就是因为scanf函数中设定的格式(“a=%d,b=%d”)(其中a=,b=均为普通字符)与输入数据的格式(1、2间用空格间隔)不一致造成的,正确的输入形式应为“a=1,b=2”(“,”也绝不能漏掉)。所以,为了保证正确输入数据,输入数据前首先看好程序中scanf函数设定的格式,再按照设定的格式正确输入数据。示例二:scanf("%d,%d",&a,&b);输入时应用以下形式:3,4↙注意3后面应是逗号,它与scanf函数中的“格式控制”中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的。3□4↙(不对)3:4↙(不对)如果是scanf("%d□□%d",&a,&b);则输入时两个数据间应空两个或更多个空格字符。如:3□□4↙或3□□□□4↙

三、附加格式说明符的说明示例一: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只能容纳一个字符,系统就把第一个字符‘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函数中规定的格式字符及其附加格式说明字符使用,不能滥用,输入数据时不能规定精度。示例三: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,67赋给b。注意:原则上“,%格式字符”应与“输入项”(&a,&b)个数相等,一一对应,此处则出现了个数不等的情况(“%格式字符”项数为3,而输入项数为2)。因为scanf函数中有附加格式说明字符“*”,加“*”项表示输入的数据不赋给相应变量,因此输入的“345”被跳过,接收下一个数据(“67”),致使“%格式字符”与“输入项”个数可以不等的情况出现。在利用现成的一批数据时,有时不需要其中某些数据,可用此法跳过它们。例如scanf("%c%c",&a,&b);printf("%c%c",a,b);输入A□B↙,输出A□‘,A’给了字符变量a‘,□’作为合法字符给了字符变量b。这时我们改用scanf("%c%*c%c",&a,&b);输入A□B↙,输出AB,‘A’给了字符变量a‘,□’被%*c跳过‘,B’就给了字符变量b。可见,使用scanf函数时,要在scanf规定的格式字符及其附加格式说明字符下使用。既不能不用,又不能滥用。

四、注意输入结束标志①遇到空格,或者回车键,或者Tab键。如果相邻两个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入一个数据后,按回车,然后再输入下一个数据。在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。示例一:scanf("%d%d",&num1,&num2);假设给num1输入12,给num2输入36,则正确的输入操作为:12□36↙或者:12↙36↙示例二:scanf("%c%c%c",&c1,&c2,&c3);如果从键盘输入a□b□c↙则字符‘a’赋给c1,字符‘□’赋给c2,字符‘b’赋给c3。因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔空格,因此空格作为下一个字符赋给c2。

故应该从键盘输入abc↙②遇到输入域宽度结束。例如“%3d”,只取3列。示例一:scanf("%3d",&num1);如果从键盘输入12345↙,则num1的值为123。③遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。示例一:scanf("%d%c%f",&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所在的地址,即输入数据所在的位置,如写成intx;scanf("%d",x);则出现写内存错误,无法运行.exe应用程序。也有人常在数组名前加地址符&。示例二:charc[10];scanf("%s",&c);这也是错误的。因为数组名表示数组的起始地址,已经指出输入数据的位置了,再使用地址符&即成为二级指针,意义截然不同,应改为charc[10];scanf("%s",c);因此,scanf函数中的“格式控制”后面只要写成指针型(一级指针)数据指出输入数据所在的位置即可,不能机械搬用,要明确实际含义。

【C语言scanf函数应用问题解答】相关文章:

c语言scanf函数作用,C语言scanf函数应用问题解答相关推荐

  1. c语言fun的作用,c语言fun函数有什么作用

    c语言fun函数有什么作用 c语言fun函数的作用是被主函数所调用,来定义一个函数或方法,这样在引用时可以用fun表示,比如[int fun(int x,int y)]. c语言fun函数的作用是: ...

  2. c语言info函数作用,c语言解析系列(4)函数

    E函数 函数只要"有一个接口,一个出口",就可以把复杂的程序连接起来.它为程序化大为小,实现模块化,避免了程序的繁长,为团队之间协作完成某一复杂的工程提供了便利的途径,高效快捷,既 ...

  3. c语言memset函数作用,C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s,int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一般 ...

  4. fclose在c语言中的作用,c语言fcloseall函数用法实例介绍

    c语言fcloseall函数用法实例介绍.fcloseall函数的返回值,函数 fcloseall() 将所有打开的流与其底层的文件或功能集合关闭.任何缓冲的数据都将首先被写入,使用 fflush(3 ...

  5. c语言 字符串拷贝函数作用,C语言不使用strcpy函数如何实现字符串复制功能

    Ⅰ )字符串复制函数 字符串复制是字符串操作中比较常用的操作之一.C语言库函数中提供的字符串复制函数是:strcpy函数.该函数的功能为:把源字符数组中的字符串复制到目的字符数组中,字符串结束标志&q ...

  6. c语言中time函数作用,C语言中时间的基本用法小结

    前言 在我学的这些编程语言中,总是记不住它们的时间处理方式,每次用到时都要重新看,所以想着在这里记录下来,也方便用到时查找,也方便有需要的朋友们参考. time_t和struct tm 在C语言中用t ...

  7. c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出

    指针: 1.指针的概念: 内存区的每一个字节有一个编号,这就是 '地址',由于通过地址能找到所需的变量单元,而地址指向该变量单元,所以将地址形象化称为 '指针'.C/C++中是可多继承的指针,而Jav ...

  8. C语言文件缓冲区作用,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲...

    //文件结构体FILE的理解以及缓冲区再讲 #include #include //要点:文件结构 //struct _iobuf { // char *_ptr; ------当前缓冲区内容指针 / ...

  9. c语言staticint的作用,C语言 static 声明静态变量?大佬原来用它干这事!

    原标题:C语言 static 声明静态变量?大佬原来用它干这事! C语言可变参数只会用算啥本事?看我来抽丝剥茧干翻它! 高手在写代码的时候,会特别注重的一点就是,对外的方法对外,不对外的方法和数据,都 ...

最新文章

  1. Android Studio 打开后无故爆红后解决办法
  2. 使用ildasm和ilasm修改dll
  3. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)
  4. 深度揭秘:腾讯存储技术发展史
  5. 西瓜书机器学习总结(一)
  6. 收藏 | 用 Keras 实现神经网络来解决梯度消失的问题
  7. Standard Deviation Normal Distribution
  8. return 输出为空php,thinkphp5 返回json数据的方法---以及返回json为空的原因
  9. linux 停止路由转发策略_Linux静态路由
  10. 机器视觉运动控制一体机应用例程|U盘视觉定位激光打标解决方案
  11. 计算机视觉的技术与应用
  12. 打通最后100米:苏宁小店如何成为家门口的“共享冰箱”
  13. 如何使用python刷博客浏览量---第一种方法
  14. 关于IDEA中使用git更新代码,会覆盖掉未提交的新代码解决问题
  15. 阿里云服务器ECS与传统服务器有哪些区别?
  16. Android 手游聚合SDK那些事
  17. 论文中稿 IEEE ACCESS 期刊
  18. HTML转为office WORD方案
  19. virtualbox设置文件夹共享(win7主机)
  20. Java开源项目—知识付费(多个版本)

热门文章

  1. supermicro服务器系统,Supermicro发布新一代1.6GHz系统总线服务器工作...
  2. 带你了解软件工程中的类与类的关系
  3. 在Weblogic 9.0配置MySQL数据源
  4. FZU1922 非主流
  5. 关于鼠标悬停功能的实现
  6. 离散数学-谓词逻辑与前束范式
  7. 每天一个Linux命令-19(which,whereis,locate,find区别)
  8. Redis主从、哨兵及集群搭建
  9. cfiledialog对话框大小_文件选择对话框:CFileDialog
  10. Loadrunner-IP欺骗