给道友纠正程序错误时,发现他们对scanf函数理解不够彻底,数据的读取不正确,进而导致程序运行错误!今天,我就根据学者的问题讲解一下scanf函数,希望学者以后避免出现与scanf相关的问题。
(一)scanf的基本格式
scanf(格式控制, 地址列表);
例如:
int a; scanf(“%d”,&a);
int a,b; scanf(“%d%d”,&a,&b);
(1)格式控制符必须用英文的双引号括起来。
(2)变量名前的&地址符号不能缺少。但是当以%s读入数据时,不能加&,因为字符串变量名代表首地址。

(二)scanf的基本原理
(1)scanf功能是读取我们输入的数据,通过匹配格式控制符把读取的数据存入对应变量。它以空格、制表符、回车符为读取的结束符。

(2)其中,牵涉到一个概念——“缓冲区”。
我们输入的数据是先存放在“缓冲区”,可以把它理解为一个队列。输入数据从队列的右端进入,而scanf读取数据是从队列的左端取出。注意:与格式控制符不匹配的数据还停留在缓冲区中。

例:scanf(“%d%d”,&a,&b);
当我们输入23 空格34回车时,scanf先读取23当遇到输入的空格时,表示第一个数据读取结束,按照第一个%d的格式,把读取的23存入变量a中;然后再读取34当遇到输入的回车时,表示第二个数据读取结束,按照第二个%d的格式,把读取的34存入变量b中。因此,变量a的值为23,b的值为34。

(三)scanf的格式设置
(1)格式控制符之间有空格、回车符、制表符
例如:int a,b;
scanf(“%d %d”,&a,&b);
scanf(“%d %d”,&a,&b); scanf(“%d\n%d”,&a,&b); scanf(“%d\t%d”,&a,&b);
输入数据要求:
输入的数据之间可以是空格、制表符、回车符,也可以是混合的空格,制表符,回车符。
输出结果说明:
scanf是以空格、制表符、回车符为结束符。但scanf格式控制符中的空格、制表符、回车符的作用是吸收空格、制表符和回车符。因此,当输入第一个数之后,再输入回车(制表符、空格)都被吸收了,scanf等待下一个数的输入,当第二个数输入后再回车(空格、制表符)时,由于第二个%d后面没有空格(制表符、回车符),因此,这个回车(空格、制表符)没有被吸收,此时scanf就以回车(空格、制表符)为结束符,停止读取。根据%d%d的格式把读取的两个数分别赋值给a和b。因此,不论格式控制符之间有没有空格、制表符、回车符,有多少空格、制表符、回车符都是一样的效果。

下面以一个小程序来说明:
例:以不同形式输入3和4

#include <iostream>
#include <fstream>
using namespace std;
int main()
{int a,b;while( scanf("%d\n%d",&a,&b)!=EOF)printf("a=%d,b=%d\n",a,b);return 0;
}

最终都会输出a=3,b=4。如图所示:

特别的:
最后一个格式符后有空格、制表符、回车符,有时候会使得数据的读取发生错误。

例如:scanf("%d\n",&a);
scanf("%d\t",&a);
scanf("%d%d ",&a,&b);

为了便于大家理解,同样列举一个小程序:输入1,2,3这3个数,并输出这3个数

#include<iostream>
using namespace std;
int main() {int a[3];for(int i=0;i<3;i++)scanf("%d\n",&a[i]); //在scanf最后一个%d后面加了\n(也可以是空格、制表符)for(int i=0;i<3;i++)printf("%d ",a[i]);return 0;
}

我们来看看程序运行的结果:但输入1 2 3之后回车,并没有输出这3个数,如下图所示:

程序还在等待输入下一个数。因此,当随机输入下一个数4回车,程序就输出了1 2 3的结果,并没有输出4。如图所示:

这到底是为什么呢?
上面我们已经谈到:scanf格式控制符中的空格、制表符、回车符作用是吸收空格、制表符、回车符。因此,当输入1 空格时,1被scanf读取存在a[0]中,而1后面的空格被\n吸收了,而scanf是以空格、制表符、回车符为结束符的,由于空格被吸收了,所以还在等待输入。同理,当输入2 空格时,2被scanf读取存在a[1]中,而2后面的空格被\n吸收了,所以还在等待输入。当输入3 空格时,3被scanf读取存在a[2]中,而3后面的空格被\n吸收了,所以还在等待输入。因此,当我们输入4再回车时,由于在这之前,for循环已经运行了3次,到输入4这已经结束了,所以4后面的回车不会被\n吸收掉,此时scanf就以回车为结束符,停止读取数据。

但是在printf的格式控制中\n表示换行回车,空格表示空格,制表符表示\t,要和scanf格式控制中的空格、回车、制表符区别哦!

以上的过程很重要,希望学者反复理解掌握!!!

(2)格式控制符之间有逗号,或者其它格式符号。
例如:int a,b;
scanf(“%d,%d”,&a,&b);//变量之间用逗号隔开
scanf(“%d+%d”,&a,&b);//变量之间用+隔开
**输入数据要求:**必须严格按照格式控制符中的格式输入数据。
scanf(“%d,%d”,&a,&b); 输入:2,3(2和3之间的逗号不能少)
scanf(“%d+%d”,&a,&b); 输入:2+3(2和3之间的+不能少)
**输出结果说明:**当按照格式输入数据后,scanf会根据格式控制符匹配来读取对应的值存放入变量中。

例:输入 2,3后,scanf会只取2和3分别赋给a和b。

正是因为scanf的这种特性,当输入的数据附带有格式设置时,会选择scanf输入,而不会用cin(适用于无格式的数据输入)

例如:以a=3 b=4的格式输入a,b的值,然后计算a+b的值;
写成:scanf(“a=%d b=%d”,&a,&b); printf(“%d\n”,a+b);
输入要求: a=3 b=4
输出结果:7

(3)一般情况下,不建议在scanf中设置数据的格式。
举个例子:

   #include<iostream>using namespace std;**int main(){int a,b;while( scanf("%3d %3d",&a,&b)!=EOF)printf("a=%3d,b=%3d\n",a,b);return 0;}

程序运行的结果:

因为%3d表示截取宽度为3的部分显示。所以当a,b的位数大于3时,会截取前3位显示。这样得到的结果并不正确。

总而言之,scanf输入函数一般不设置数据的格式,否则很容易出问题。一般情况下,我们是在printf输出函数中才会设置数据显示的格式。

为了便于道友们向我咨询问题,特意开设了一个免费的知识星球——CaptianXue,星球提供学习、理财、生活、职场等各类文章和免费答疑!!

scanf详细讲解——你真的会用吗?相关推荐

  1. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  2. mybatis-plus超详细讲解

    (6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...

  3. C语言答案解析,C语言题库带详细讲解答案解析.doc

    C语言题库带详细讲解答案解析.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...

  4. Redis最详细讲解

    Redis最详细讲解 原文地址 本文脑图 redis基本数据结构 本文脑图 前言 Redis核心对象 String类型 int SDS SDS与c语言字符串对比 String类型应用 Hash类型 字 ...

  5. 【OS系列-2】- 进程详细讲解(代码示例)

    进程 进程详细讲解(代码示例) 进程 示例代码 创建进程的具体过程? 执行 fork()的时候系统做了什么? 进程间通信 管道 消息队列 共享内存 信号量 套接字 进程间同步 信号量 文件锁 无锁 C ...

  6. 冒泡排序法究极详细讲解*

    冒泡排序法究极详细讲解* 前言:冒泡排序法是排序问题中最通解与基础的方法.它是利用循环结构对一连串的数字进行排序.接下来就和大家分享具体原理与食用方法. 文章目录 冒泡排序法究极详细讲解* 一.基本原 ...

  7. 2.5万字详细讲解个人网站的开发过程和项目的部署

    目录 简介 1 技术介绍 1.1 个人博客功能 1.2 技术组合 1.3 工具与坏境 2 项目的环境配置 2.1 vue的环境配置 2.2 解决跨域问题 2.3 关于图标的获取 3 前端技术 3.1 ...

  8. [转帖]详细讲解六大QQ病毒的特征以及清除方法

    [转帖]详细讲解六大QQ病毒的特征以及清除方法  一."QQ尾巴"病毒 病毒主要特征 这种病毒并不是利用QQ本身的漏洞 进行传播.它其实是在某个网站首页上嵌入了一段恶意代码,利用I ...

  9. Python新手爬虫训练小项目《爬取彼岸图网》(超详细讲解版)

    Python新手爬虫训练小项目<爬取彼岸图网>(超详细讲解版) 这是我的第一篇文章,作为一名新手爬虫,这个算是我这几天来的努力成果,虽然代码寥寥几行但花费了大半天,新手上路还是不能只看视频 ...

最新文章

  1. 为什么我的python没有run_为什么我的returncode=0而没有stdoutsubprocess.run?
  2. pd.DataFrame.drop_duplicates
  3. python3.9出了吗_Python 3.9 正式版要来了,会有哪些新特性?
  4. 理正地基基础计算机辅助设计的英文缩写,理正基础CAD软件介绍理正基础CAD软件介绍.pdf...
  5. PHP自学3——在html的table标签中显示用户提交表单
  6. 获取当前图层所处的坐标系统(C++)(ArcObject开发)
  7. 关于TortoiseGit汉化包装了,但仍然是英文菜单的问题记录
  8. oracle bookauthor,Oracle 聚簇(征集)
  9. 正确地利用Netty建立连接池
  10. ThinkPHP框架短信接口
  11. 计算机突然有一个盘打不开,电脑分区突然打不开的原因及解决方法
  12. html文字竖排垂直居中显示,CSS文字竖排效果且垂直居中水平居中
  13. ps制作html网页的跳转,PS图片转页面CSS+HTML的步骤
  14. 《纽约客》:还原真实的扎克伯格
  15. 刘莹:提升站内搜索的五大必要性
  16. 粒子群算法python实现: 带活化因子
  17. QPSK调制解调过程,包括串并转换,电平转换,载波调制,相干解调,抽样判决等
  18. 学习《java程序设计》第一周学习总结
  19. 【数据结构课设】扫雷 (java实现)
  20. 如何实现“新手引导”效果

热门文章

  1. Pandas reindex重置索引
  2. 林志玲结婚,给程序员送加班
  3. [翻译]《高级英汉翻译理论与实践》摘录
  4. 12:jquery查找
  5. 建立自信心的有效方法
  6. Scripting.FileSystemObject对象
  7. Threat Intellgence
  8. 湖南计算机职业技术学院专业排名,湖南信息职业技术学院王牌专业有哪些及专业排名...
  9. autoform材料_jQuery AutoForm脚本Easy Form AutoComplete
  10. c语言线程唤醒signal,多线程编程与signal信号处理