scanf语句的使用和执行原理

2023-11-15

scanf语句的使用和执行原理

1、如何使用scanf:

%d说明我们现在要读入一个整数了,scanf这个函数会读入一个整数,读到的结果赋值给指定变量,要注意指定变量前面的&

scanf("%d",&price);

如果要读入输入的数据,就必须严格按照""中的格式输入,如:

scanf("%d,%d",&a,&b);

输入应为1,2,此时可以正常读取,正常输出,如图所示:

在这里插入图片描述

但是如果我们不严格按照""中的格式输入,读取就会出现问题,如图所示:

在这里插入图片描述
输入缓冲区是行缓冲区,当你按下回车之前,除非特意对缓冲区进行刷新,否则你的程序不会读到任何东西,回车符会使行缓冲区进行刷新,即回车符是输入结束的标志。虽然说输入的结束标志是回车键,但是回车键并不一定代表输入结束,如果你输入的并没有满足scanf语句读取的格式化的内容,scanf会把回车键视作一个空格。

scanf("%d %d",&a,&b);

输入格式1 2或者 1(回车)2都是对的,输入回车时还没有满足scanf语句读取的格式化的内容,因此会把回车键视作一个空格。
在这里插入图片描述

我们要注意下面这段代码,输入应为1 2(2的后面还应该有个任意符号来满足那个空格,唯独不能用回车符来满足这个空格,回车符作为空格被读入,但是后面输入的作为行结束标志的回车符就不会被读到程序中。

scanf("%d %d ",&a,&b);

在这里插入图片描述

不过我们依然可以用回车符来满足中间的那个空格,如下图所示:

在这里插入图片描述

同上述代码一样,2的后面随便再输入什么东西来满足这个回车号,唯独不能用回车符来满足这个最后的回车号,回车符作为空格被读入,但是后面输入的作为行结束标志的回车符不会被读到程序中。

scanf("%d %d/n",&a,&b);//输入1 2

在这里插入图片描述

2、scanf语句的原理

scanf并不会直接从我们的键盘输入中读取数据,我们从键盘输入的数据先存储在输入缓冲区中,当按下回车键后,即输入缓冲区遇到回车符时,会对输入缓冲区进行一个刷新,程序才会在输入缓冲区中读取数据,scanf读取到空格、tab或者回车符的时候停止读取。

例子:

int main()
{
	int arr[10] = { 0 };
	int i = 0;

	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}

	return 0;
}

上面这段代码它是如何给数组赋值的呢?

在第一次进入for循环执行到scanf语句的时候,会跳出命令行窗口,输入我们想要给数组赋的值,注意这里是一次性输入所有的值:
在这里插入图片描述
这些输入的值并不是直接被scanf语句读取,而是存储到输入缓冲区,当按下回车键(即输入回车符)的时候,输入缓冲区中便有了回车符,此时scanf语句开始读取输入缓冲区中的值,此时i的值为0,读取到1赋值给arr[0],读取完后scanf语句会继续读取,读取完空格后scanf语句就会停止读取,进入下一轮循环,此时i的值为1,scanf语句接着后面继续读取,就会把读取的2赋值给arr[1],然后继续读取空格,停止读取,进入下一轮循环,直到读取到回车符,停止读取,此时i的值为10,循环结束。

这个时候会有小伙伴们疑惑了,scanf每次读取完数字后,真的继续把后面的空格也读取掉了?

这里我们直接上代码调试证明一下即可。

如图所示,我们在scanf语句中的%d后面添加一个%c,看看会不会读取空格赋值给变量c1:

在这里插入图片描述

我们先在135行也就是for循环处设置断点,然后开始调试,监视c1,i和arr[i]的值,往下走到136行,也就是scanf语句处,此时scanf语句未执行,所以没有任何变化,再往下走,走到137行,此时scanf语句已经执行,我们在命令行窗口一次性输入需要给数组赋的值,1 2 3 4,然后按下回车键:

在这里插入图片描述

观察此时的arr[i]和c1:

在这里插入图片描述

如图所示此时arr[0]的值为1,说明scanf语句读取了数字1赋值给了arr[0],此时c1的值为32(‘ ’)说明scanf语句读取了数字1赋值给arr[0]后确实读取了后面的空格并且将其赋值给了变量c1。

这说明scanf语句读取完数字后,会把后面的空格也读取掉。如果后面有变量来接收,读取后就会把空格赋值给对应的变量,如果没有变量来接收,那么仅仅是读取,不会进行赋值操作。值得注意的是,scanf只有在读取完数字后会继续把后面的空格读取掉

我们仔细看看下面这段代码:

char word[8];
scanf("%s",word);//Hello world
printf("%s##\n",word);//Hello##

这说明读取完字符o后,并没有将后面的空格读取出来,遇到空格就直接停止读取了。

那么后面的流程大家应该都知道了,每一轮for循环,scanf语句都会读取数字赋值给数组单元,然后把后面的空格读取掉,停止读取,进入下一轮循环,但是在最后一轮循环中有些许不同,scanf读取掉4后,后面不是空格了,而是回车符,因此scanf会把后面的回车符读掉,然后停止读取,后面i自增1,i的值为4跳出循环。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scanf语句的使用和执行原理 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • zTree 树插件异步加载地区数据

    之前使用zTree树插件实现全国五级地区点击后加载 今天记录使用zTree 树插件异步加载地区数据 还是上次的需求 http blog csdn net li ya fei article details 79234265 document
  • react——组件API

    h1 h1 h1 react组件API h1 p 在本章我们将讨论react组件的API 设置状态 setState 替换状态 replaceState 设置属性 setProps 替换属性 replaceProps 强制更新 forceU
  • 情侣飞行棋 情侣小游戏 2023 抖音

    飞行棋网站地址 https effect guoyaxue top fxq index html 以及各种新版来袭 以及各种情侣小游戏合集 https fxnew guoyaxue top
  • uni.uploadFile遇见的坑uploadFile:fail createUploadTask:fail file not found

    uni uploadFile遇见的坑 这两天用uni uni uploadFile遇见个坑上传图片时候一直报错 uploadFile fail createUploadTask fail file not found 我尝试各种方法都没解决
  • Mysql 左外联查left join及多次联查同一张表时的sql优化调优。

    近期接触了大量用户数据导出业务 因业务生命周期短及需程序少迭代等约束 遂编写大SQL用以导出大量用户数据 初版Sql 为正常的左外联查并对应的对及联条件引入联合索引此为sql优化点 1 针对联查条件引入索引 EXPLAIN SELECT a
  • python pandas中ExcelFile与read_excel的区别

    ExcelFile与read excel是pandas中处理excel文件的两个方法 本文将从实例进行说明 来介绍这两种方法的区别 事实上 尽管预料到pandas同时支持这两种方法 但整体上我还不知道pandas对这两个方法的定位是什么 而
  • postman使用技巧

    文章目录 postman使用技巧 动态获取token 1 使用restful API接口登录设备 2 添加token变量 3 添加token判断 postman使用技巧 动态获取token 1 使用restful API接口登录设备 2 添
  • 毕业设计-基于协同过滤算法的个性化推荐系统

    目录 前言 课题背景和意义 实现技术思路 一 预备知识 二 基于SlopeOne的协同过滤推荐优化算法 三 基于改进 的协同过滤推荐优化算法 四 结论及展望 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为
  • Exception:两个类具有相同的 XML 类型名称,请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称...

    两个类具有相同的 XML 类型名称 http service webservice base xm searchAccountBatchResponse 请使用 XmlType name 和 XmlType namespace 为类分配不同
  • MyBatis choose、when和otherwise标签简介说明

    转自 MyBatis choose when和otherwise标签简介说明 MyBatis 中动态语句 choose when otherwise其功能 同Java中的switch case default语句相同 但是因为MyBatis
  • stata 线性回归分析基本操作

    一 线性回归基本命令 regress y x1 x2 红色表示该命令可简写为红色部分 以 Nerlove 数据为例 数据附后文 regress lntc lnq lnpf lnpk lnpl 表上半部分为方差分析表 包括回归平方和 残差平方
  • python对excel增删改查语句_python对 MySQL 数据库进行增删改查的脚本

    coding utf 8 import pymysql import xlrd import codecs 连接数据库 conn pymysql connect host 127 0 0 1 port 3306 user root pass
  • 不显示头像服务器问题,完美解决Gravatar头像不显示的问题

    最近一段时间 感觉我的博客打开速度很慢 页面总是加载不完 仔细检查发现gravatar头像不显示了 再一搜才知道原来gravatar的头像服务器被那啥了 对于隔三差五出现这种情况 相信各位已经无力吐槽 只能在心里默念一句 祝病魔早日 原博主
  • HarmonyOSd第一次任务

    JS FA 应用的 JS 模块 entry src main js module 的典型开发目录结构如下 目录结构中文件分类如下 hml 结尾的 HML 模板文件 这个文件用来描述当前页面的文件布局结构 css 结尾的 CSS 样式文件 这
  • Centos 磁盘根目录扩容

    Centos磁盘根目录扩容 1 扩容前检查 命令 df Th or df h 我们要扩张磁盘空间的就是挂载点为 的这个 2 添加sda磁盘空间查询磁盘 命令 fdisk l 其实 我们可以将sda的磁盘新增空间分配给处于sda的 挂载目录
  • 折线图横坐标怎么设置_Excel折线图的横坐标如何设置?方法超简单,赶快学起来...

    在我们平时使用Excel表格来进行各种数据的编辑工作时 我们往往会因为某一些实际的需求 需要在表格当中插入一些图表 以此来更加清晰 直观的展现此时表格数据当中的内容 而在Excel表格当中插入折线图 相信这是很多小伙伴都会做的工作 尤其是想
  • TCL变量

    目录 简单变量 数组 相关命令 set unset append和incr 简单变量 一个 TCL 的简单变量包含两个部分 名字和值 名字和值都可以是任意字符串 例如一个名为 1323 7 hdgg 的变量在 TCL 中都是合法的 不过为了
  • SSD,PCI-E,NVMe,M.2分类详解

    SSD PCI E NVMe M 2分类详解 首先说一下目前固态硬盘常用的两个接口 与主板相连的接口形状 SATA3和M 2 1 采用SATA3接口 目前机械硬盘采用的接口方式 的固态硬盘 在传输方式上与SATA3 的机械硬盘一样 速度的提
  • 如何使用Pandas的ExcelWriter进行excel操作

    pandas ExcelWriter定制格式 定制表头 渲染颜色等 非ExcelWriter标准的创建模式 ExcelWriter这个插件有个坑 就是已经设置好的格式是无法更改的 因此 由pandas转成excel的时候 必须将格式清除 尤
  • scanf语句的使用和执行原理

    scanf语句的使用和执行原理 1 如何使用scanf 2 scanf语句的原理 1 如何使用scanf d说明我们现在要读入一个整数了 scanf这个函数会读入一个整数 读到的结果赋值给指定变量 要注意指定变量前面的 scanf d pr