scanf()函数的原理

想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组。

当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。

现在假设你的缓冲区里有:abcd\n1234\n (其中\n是回车符)执行:scanf("%s",name);的时候,由于scanf是读数据直到看见空白符(空白符:指空格符、制表符、回车符)就停止的输入函数。所以执行后,把abcd存到了name中。缓冲区于是变成了 : \n1234\n

接下来的执行就有问题了,如果遇到了:scanf("%d",&number);怎么办?因为遇到了回车符,它并不是一个数字,所以scanf还有一个特性,就是忽略先导的空白符。不管是有几百个回车也好,几万个空格也罢,只要它们连续地出现在缓冲区的开头,就统统忽略他们。然后再读有意义的字符。于是1234被读入number。

回到刚刚,当缓冲区还是:\n1234\n的时候,如果遇到了:scanf("%c",&sex);应该怎么办呢?你说,那好办呀,不是说了忽略前导空白符吗?跳过回车读’1’呀!想法是好的,可这只针对你的程序这一种情况。如果我编写的程序就是统计用户输入了多少个回车呢?所以对scanf来讲跳过前导空白符有个例外,当参数是%c的时候,就把缓冲区的第一个字符返回回去,不管是什么

这样的设计就有个问题,scanf对不同的参数表现出来的特性不一样。得承认,这是个缺陷,但不是说这样不好。

这样的设计至少把发现所有字符的机会交给了用户,设计者这样想:如果程序员使用了scanf("%c",…),那他就有必要知道这函数能把回车符读出来,至于程序员对回车符感不感兴趣,那就看他了,不感兴趣的话,程序员也一定知道该怎么处理。回到你的程序里。

当执行scanf("%s",name)的时候,要求你从键盘输入,于是你输入了"abc",然后“回车”。缓冲区里自然而然地是:abc\n scanf把abc拿走了,留下了\n,缓冲区里现在就剩下\n于是,下一个scanf ("%c",&sex); 想当然地读取了\n

  • 关于scanf忽略前导空白符这一点,可以这样验证
    写个程序,用scanf()读数据,只要不是%c就行。然后输入的时候,随便输入回车、空格、制表符,然后“回车”确认。会发现程序依然提示等待你输入。就是因为它忽略掉所有前导空白符之后发现缓冲区是空的!于是乖乖地阻塞住,等待你输入。

  • 关于scanf是直到看见空白符结束读取这一点,如果你是初学C的话,那么很快你就会遇到另一个函数,叫gets()。
    程序里如果我们想一次读入一个英文句子:I am a student.如果你用scanf读的话,只能读出"I",想读出后面的东西要不断调scanf。此时需要用gets,这个函数不管是什么一律读进来,直到遇到回车符才停下。总之,各有各的用途,全都熟悉之后,才能在恰当的时候恰当地使用。
    以上转自:http://blog.pfan.cn/katwood/53198.html
    最后感谢大牛的分享。

c语言scanf()函数的原理相关推荐

  1. C语言scanf函数奇遇记

    C语言scanf函数奇遇记 作者:ocean    撰写日期:2011-11-20 博客链接:http://oceanspace.tk 看<The C Programming Language& ...

  2. c语言添加输入函数吗,C语言scanf()函数下支持中文输入吗?

    C语言scanf()函数下支持中文输入吗? C语言scanf()函数下支持中文输入吗? 如果我编写一个程序,要求是先输入姓,再输入名,然后按照常姓名的方式排列出来,如果我需要输入中文该怎么办? 搜索更 ...

  3. C语言scanf()函数的返回值

    C语言scanf()函数的返回值 代码例子: #include<stdio.h> int main(){int num1=0,num2=0;int value= scanf("% ...

  4. c语言scanf函数计算乘积,C语言Scanf函数

    C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...

  5. c语言scanf函数作用,C语言scanf函数应用问题解答

    C语言scanf函数应用问题解答 C语言的输入是由系统提供的库函数完成的.scanf函数是C语言中最常用且功能最强的输入函数,但该函数如使用不慎,就会出现错误或得不到预想的结果.以下结果都是基于VC+ ...

  6. C语言scanf函数

    C语言scanf函数 函数名:scanf 功能:实现格式化输入 格式:scanf("<格式化字符串>",地址表) scanf函数是通用终端格式化输入函数,它从标准设备键 ...

  7. C语言 | scanf函数

    C语言使用scanf输入一个数 #include<stdio.h>//头文件 int main()//主函数 程序的入口 {int num;printf("请输入一个数:&quo ...

  8. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  9. C语言scanf函数详解和示例

    文章目录 一.数据输入 二.断章取义 三.scanf输入 1.输入整数 2.输入字符 3.输入浮点数 4.输入字符串 5.输入多个内容 6.示例(book13.c) 四.注意事项 五.获取视频教程 六 ...

最新文章

  1. 低头族的第三只眼,“赛博朋克”新装备让你走路不再撞树
  2. OpenStack部署
  3. 注意语句顺序 防止Servlet Request Response乱码
  4. Spring Initializr创建项目,利用阿里云URL解决Initialization failed for https://start.spring.io Please check URL
  5. dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
  6. 自己实现的atof()和atoi()代码 (转)
  7. 计算机与人力资源管理论文,计算机专业毕业论文-人力资源管理系统的研究与实现...
  8. 电子设计竞赛(4)-常用的两种PID算法
  9. 奖金15万!全球首届“AI球球大作战:Go-Bigger多智能体决策智能挑战赛”开启
  10. suse linux修改ftp端口,suse Linux系统下的网络设置(ftp telnet xmanager)
  11. Conda activate报错 CommandNotFoundError: Your shell has not been properly configured to use ‘conda
  12. Linux 内核版本命名
  13. @propertysource 读不到properties_敢不敢来挑战,读对一班就是学霸
  14. MvcPager使用的Demo(同步分页)
  15. android am命令用法
  16. Linux中vim编辑器常用命令、文件查找、磁盘挂载、用户管理
  17. 数据库考研信息管理系统
  18. Android开发 人民币符号(¥)显示不一致的问题
  19. python大数据就业方向_大数据专业未来的就业方向有哪些?[黑马程序员]
  20. 分享一个目前还支持离线下载的网盘

热门文章

  1. ASP.NET Core 实现带认证功能的Web代理服务器
  2. Spring Boot后端+Vue前端+微信小程序,完整的开源解决方案!
  3. 天才大猩猩可可去世,享年 46 岁
  4. 统一的定义导航栏的背景颜色(NavigationController)
  5. oracle 表空间维护
  6. 告诉大家一个------无敌命令
  7. 多系统权限设计(一)
  8. Biztalk发布web服务时遭遇'SoapExceptionInternal SOAP Processing Failure'错误
  9. Linux mktime 源代码简析
  10. mysql按章_mysql按时间范围分区