scanf函数的读取

2023-11-19

scanf的处理机制

scanf()以删除的方式从缓冲区读取数据(输入设备的数据存储缓冲区,比如键盘);也就是说,scanf从缓冲区读入一个数据项,该数据项在缓冲区中就被清除掉了。而如果scanf需要读取一个数据项,返现缓冲区当前是空的,那么程序就会在scanf代码处阻塞,等待用户输入,scanf函数接收到相应的数据项之后,在缓冲区中将这一数据项清除,scanf函数返回,程序继续执行。
格式化字符串(format string)

格式化字符串

规定了 scanf 等函数如何从输入缓冲 stdin 中读取数据,其组成字符的含义如下所示:

(1)空白字符(whitespace)。scanf 会读取并忽略在 stdin 中下一个非空白字符之前的所有空白字符(空格、换行和 tab),然后读取格式化字符串中规定格式的数据。若格式化字符串中包含空白字符,则该空白字符会与输入缓冲区中任意数量的连续空白字符相匹配,并将其从缓冲区中清除(包括0个)。例如格式化字符串"%d %d",会要求 scanf 首先从缓冲区中读取一个整型(若之前存在空白字符则跳过),再跳过输入缓冲区中连续的空白字符(与格式化字符串中的空白字符匹配),最后再读取一个整形;

(2)非空白字符(non whitespace)。对于格式化字符串中既非空白字符又不是格式说明符(format specifier,由%标识)的一部分的字符,scanf 会尝试从 stdin 中读取输入,并将输入与该字符比较,若匹配,则继续进行后续读取,若不匹配,则函数返回错误信息;

(3)格式说明符。以 % 开头的用于指定输入数据格式的字符。如 %d 指定需要读取一个整形,%s 需要读取一个字符串。scanf 等函数首先根据格式说明符尝试去解析 stdin 中的数据,如对于 %d ,scanf 会尝试对 stdin 中已有数据以整型的格式进行解析。若解析成功,则将上述解析结果存放到指定的内存中,若解析失败,如 stdin 中仅存在一个字符 ‘a’,scanf 会退出并返回,但是上述不匹配的数据并不会从缓冲区中清除,后续的 scanf 调用仍从上述输入开始读取
  除了%c 其他转化说明都会自动跳过待输入值前面所有的空格

scanf的返回值

scanf通常返回的是成功赋值(从标准输入设备赋值到参数列表所指定的内存区域)的数据项数,如果出错或是遇到end of file(注意,如果想从键盘输入EOF,在windows的DOS窗口用Ctrl+Z 或F6;在UNIX系统上,用CTRL+D。),则返回EOF

1.格式不匹配问题

#include "stdafx.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
	int nNum = 0;

	scanf("%d",&nNum);//输入AB

	printf("%d\n",nNum);

	char chA = '0';
	chA = getchar();
	printf("%c\n",chA);
	return 0;
}

在这里插入图片描述

将AB送到缓冲区,scanf函数读取缓冲区内容,发现与格式不匹配,不会把值赋给nNum,他并不会丢弃该内容,而是将其放回缓冲区,下一次缓冲区读取仍从这里开始,所以下面chA的值为A

2.scanf的返回值

#include "stdafx.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
	int nNum = 0;
	char chA = '0';

	int nResult = scanf("%d%c",&nNum,&chA);//输入AB

	printf("nNum = %d\n",nNum);
	printf("nResult = %d\n",nResult);
	printf("chA = %c\n",chA);


	scanf("%c",&chA);
	printf("Again chA = %c\n",chA);

	return 0;
}

在这里插入图片描述

我们可以看到当第一个参数读取失败的时候,后面的所有都不会被读取,
当再次尝试为chA赋值的时候 缓冲区还是从指向A,从他开始读取。
而且返回值是0,表示读取成功了0个参数。

2.1

int main(int argc, char* argv[])
{
	int nNum = 0;
	char chA = '0';

	int nResult = scanf("%c%d",&chA,&nNum);//输入AB

	printf("nNum = %d\n",nNum);
	printf("nResult = %d\n",nResult);
	printf("chA = %c\n",chA);

	scanf("%c",&chA);
	printf("Again chA = %c\n",chA);

	return 0;
}

在这里插入图片描述
我们可以看到参数的返回值是1,表示读取成功了一个参数,就是chA = ‘A’;
然后scanf尝试为参数nNum读取时,发现不匹配,将字符B放回缓冲区,并结束该次的scanf,当再次从缓冲区为chA读取数据时,读取的便是字符B了

3空白字符问题(空格 换行 和 Tab)

int main(int argc, char* argv[])
{
	int nNum = 0;
	char chA = '0';

	int nResult = scanf("%c%d",&chA,&nNum);//输入空格AB

	printf("nNum = %d\n",nNum);
	printf("nResult = %d\n",nResult);
	printf("chA = %c\n",chA);


	scanf("%c",&chA);
	printf("Again chA = %c\n",chA);

	return 0;
}

在这里插入图片描述
chA读取的便是空格 第二次才读取到A,%c不会忽略空白字符,别的都会忽略,可以自己去尝试

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

scanf函数的读取 的相关文章

  • python:转义字符和input()的用法

    1 1转义字符 1序列 表反斜杆 表单引号 表双引号 a表ASCLL响铃符 BEL b表ASCLL退格符 BS f表ASCLL进纸符 FF n表ASCLL换行符 LF N name 表Udicode数据库中的字符名 其中name时它的名字
  • python 使用 openpyxl 打开及读取 excel 表格

    python 使用 openpyxl 打开及读取 excel 表格 openpyxl简介 安装openpyxl 打开及读取表格内容 1 打开 Excel 表格并获取表格名称 2 通过 sheet 名称获取表格 3 获取表格的尺寸大小 几行几
  • Spring创建Bean实例的方式

    目录 简介 源码分析 resolveBeforeInstantiation创建Bean实例 doCreateBean创建Bean实例 Supplier创建实例 FactoryMethod创建实例 自动装配构造函数创建实例 无参构造函数创建实
  • nslookup命令详解

    nslookup命令用于查询DNS的记录 查看域名解析是否正常 在网络故障的时候用来诊断网络问题 nslookup的用法相对来说还是蛮简单的 主要是下面的几个用法 1 直接查询 这个可能大家用到最多 查询一个域名的A记录 nslookup

随机推荐

  • 解决Proteus仿真时候提示Could not load simulator DLL错误

    之前在进行Proteus仿真时候 弹出来三个错误 分别是 1 Could not load simulator DLL E Program Files x86 BIN PROSPICE DLL 2 Could not find or run
  • 二阶电路的零状态响应

    二阶电路零状态响应公式推导 下图所示电路在 时电容和电感上储能都为零 即 t 0 时开关闭合 电压源 Us 开始对电路供电 现讨论 时响应的变化规律 电路的 KVL 方程为换路后电路的初始状态为 0 即 这是二阶线性非齐次微分方程 它的解由
  • vue中点击第一次没有触发按钮怎么操作_vue如何触发某个元素的单击事件?

    我来回答一波吧 因为没复习 导致知识点结合不紧密 原生的中 我们的写法是这样的 王蒿大爷 function myFunction document getElementById demo innerHTML Hello World wind
  • 程序员简历应该怎么写?

    说到程序员简历 这两个月 我看过不下10 000份简历 答主不是HR 也不是技术负责人 但是在网站的运营工作中 每天最开心的事情就是研究候选人的简历了 这些人中 有BAT的资深大牛程序员 也有90后程序员小鲜肉 有人到中年的程序员渴望去创业
  • MyBatis参数传入集合之foreach动态sql

    foreach的主要用在构建in条件中 它可以在SQL语句中进行迭代一个集合 foreach元素的属性主要有item index collection open separator close item表示集合中每一个元素进行迭代时的别名
  • 期货反向跟单--交易员的培养问题

    根据我们统计的数据显示 今年做国内期货反向跟单的团队 无论是从赢利金额 稳定性 还是成功概率 都比做国际期货的团队要高 尤其是最近纯碱 焦煤焦炭 PTA 红枣等几个品种的行情 更是频繁拉爆了很多盘手的账户 本文转发自公众号 反跟单交易 转载
  • 【Mysql】Communications link failure,The last packet sent successfully to the server was 0 millisecond

    项目背景是数据库和项目不在同一台服务器下 在启动时 突然遇到以下错误 Exception in thread main com mysql jdbc exceptions jdbc4 CommunicationsException Comm
  • Java图书馆

    io流用的不是很熟练 还有Book类的应用出了点问题 越改越错 从2个错误改到102个QAQ 孩子想哭 问了好多人也没改成 最后勉强成型 而且上个星期内分泌系统出了点小问题 天天往医院跑 开始敲的太晚了 现在要备战期末考 等期末考结束再改改
  • Linux系统编程:多线程交替打印ABC

    引言 分享关于线程的一道测试题 因为网上基本都是Java的解决方法 决定自己写一篇来记录一下线程的学习 问题描述 编写一个至少具有三个线程的程序 称之为线程 A B 和 C 其中线程 A 输出字符 A 线程 B 输出字符 B 线程 C 输出
  • Spring源码深度解析:文章目录

    文章目录 序号 内容 链接地址 1 一 Spring整体架构和源码环境搭建 https blog csdn net wts563540 article details 126686645 2 二 手写模拟Spring https blog
  • Windows server 2016 部署 AD域

    AD域的简单介绍 为什么要使用域 假设你是协会的系统管理员 管理高职部所有的机房 如果你要为每台电脑设置登录帐户 设置权限 比如是否允许登录帐户安装软件 那你要分别坐在所有电脑前一一设置 如果你要做一些改变 你也要分别在这所有电脑上修改 相
  • 【论文解读】NLP重铸篇之Word2vec

    论文标题 Efficient Estimation of Word Representations in Vector Space论文链接 https arxiv org pdf 1301 3781 pdf复现代码地址 https gith
  • mysql出现“ You can't specify target table '表名' for update in FROM clause”解决方法

    You can t specify target table 表名 for update in FROM clause 翻译为 不能先select出同一表中的某些值 再update这个表 在同一语句中 实例 表 result 表studen
  • (java 基础知识) Java打印---javax.print

    package com print import java io import javax print import javax print attribute import javax print attribute standard p
  • 华为OD机试 - 快递运输(Java)

    题目描述 一辆运送快递的货车 运送的快递放在大小不等的长方体快递盒中 为了能够装载更多的快递 同时不能让货车超载 需要计算最多能装多少个快递 注 快递的体积不受限制 快递数最多1000个 货车载重最大50000 输入描述 第一行输入每个快递
  • React Native_综合练习(react-navigation)

    据说 react natvigation是官方推荐使用的 搞不懂为啥官方放弃更新natigator了 所以在上篇文章的基础上使用react natvigation 1 StackNavigator 用来跳转页面和传递参数 2 TabNavi
  • Linux系统移植:Kernel 顶层 Makefile(下)

    Linux系统移植 Kernel 顶层 Makefile 下 继续分析 Linux 内核源码顶层 Makefile 执行过程 一 make defconfig 过程 与 uboot 的顶层 makefile 相同 在编译源码前 要用 mak
  • 解决openai网站拒绝访问的问题,Access denied,You do not have access to chat.openai.com

    解决步骤 清除浏览器的历史纪录数据 尝试更换科学上网节点 开启无痕浏览模式 我通过这三个步骤登录成功了 希望可以帮助到大家
  • F5杯—网络是有记忆的

    0x00 前言 CTF 加解密合集 CTF 加解密合集 0x01 题目 网络有记忆 我也有 所以 我想她了 提示 1 题目既提示 2 flag包括小写字母 单词 下划线 IDEgOChWMyVNM1wtGVhbI1NeMCE0Vy9RHVB
  • scanf函数的读取

    scanf的处理机制 scanf 以删除的方式从缓冲区读取数据 输入设备的数据存储缓冲区 比如键盘 也就是说 scanf从缓冲区读入一个数据项 该数据项在缓冲区中就被清除掉了 而如果scanf需要读取一个数据项 返现缓冲区当前是空的 那么程