C语言scanf函数详解..

1.前言

前面说过了printf函数 他是将二进制表示的整数、浮点数、字符、字符串根据转换规范转换成字符或者字符串 并且打印到了控制台上 那么既然有了输出函数 那么肯定也有输入函数咯
的确如此 他就是scanf函数 他是将字符或者字符串根据转换规范转换成二进制表示的整数、浮点数、字符、字符串 储存到了相应的变量中

int main(){
    char ch;
    short s;
    int i;
    long l;
    long long ll;
    float f;
    double df;
    scanf("%hhd %hd %d %ld %lld %f %lf", &ch, &s, &i, &l, &ll, &f, &df);// 65 66 67 68 69 1.23 1.234
    printf("%hhd %hd %d %ld %lld %f %lf", ch, s, i, l, ll, f, df);// 65 66 67 68 69 1.230000 1.234000
    return 0;
}

2.scanf的注意事项

scanf主要有以下这些注意事项:
1.scanf函数是一个变参函数(变参体现在参数数量和参数类型的不确定)
2.scanf函数的第一个参数是字符串
3.scanf函数的第一个参数的内容是是匹配的字符以及转换规范
4.scanf函数的后续参数是字符或者字符串转换完毕以后存放的位置
5.scanf函数的后续参数的数量和类型要和第一个参数中的转换规范依次对应
上述五点中 我们着重讲一下3、4两点

1.第一个参数内容为匹配字符和转换规范

有什么字符 你要跟着输入什么字符用于匹配

int main(){
    int i;
    long l;
    scanf("%d, %ld", &i, &l);// 1,1
    printf("%d %ld", i, l);// 1 1
    return 0;
}

2.后续参数为转换完毕以后存放的位置

后续参数记得取的是地址值 所以对于大部分的变量来说需要加&取地址符 但是对于数组名来说 由于他本身为地址的缘故 所以无需加上取地址符

3.scanf函数的具体操作

第一步就是将键入的字符串和第一个参数进行依次匹配
在这里插入图片描述
第二步就是根据转换规范将字符或者字符串转换为二进制表示的各种类型
不同的转换规范对应的转换方式如下所示:
在这里插入图片描述
第三步就是将转换完毕的二进制数据依次储存到变量中去

4.几类错误案例

1.长度正确但是类型错误

int main(){
    long long ll;
    scanf("%lf", &ll);
    printf("%lld\n", ll);// 4638387438405602509
    printf("%lf", ll);// 123.450000
    return 0;
}

这个案例中 我们将输入的123.45和%lf进行匹配 匹配成功之后 将其转换为double类型的数据 其占8个字节 然后存储到同为8个字节的long long类型变量中 这样ll就是一个存有double类型数据的整型变量了
接着通过%lld的转换规范进行打印 他的打印结果是截取sizeof(long long)个字节 然后将二进制数据转换为有符号的十进制整型 这与我们所期待的浮点数结果不符 所以结果自然错误打印出来了
但是如果利用%lf这个转换规范进行打印的话 结果自然是被正确打印了
但是最好是不要采用整数来储存浮点数这种做法 而是利用相应的浮点数类型储存较为妥当

2.输入的字符串数值大于转换操作类型的取值范围

int main(){
    short s;
    scanf("%hd", &s);// 2100000000
    printf("%hd", s);// 29952
    return 0;
}

2100000000这个数据明显用2个字节的short类型无法承载 所以最后无法正确打印结果

3.变量无法装载转换结果

int main(){
    short s;
    scanf("%d", &s);// 2100000000
    printf("%ld", s);// 29952
    return 0;
}

这个数据远远超出了2个字节类型short的承载范围 所以如果用short类型进行承载的话 那么就会丢失2个字节的数据 结果就是无法正确表示这个数据

4.避免以上错误

为了避免以上错误 要求我们在书写scanf函数的时候注意规范
所谓规范就是要保持输入的字符串数值和转换规范以及存放的变量类型要一致才行

5.字符和字符串的输入

刚才我们讨论的都是有关整数和浮点数的输入问题 现在讨论字符和字符串的输入

1.字符的输入

int main(){
    char ch;
    scanf("%c", &ch);// A
    printf("%c %hhd", ch, ch);// A 65
    return 0;
}

上述案例中 我输入65和第一个字符串中的%c匹配成功 然后将这个数据转换为二进制表示的字符 然后将其存入ch变量中 我用%c打印出这个变量的字符形式 用%hhd打印出这个变量的整数形式

2.字符串的输入

int main(){
    char str[10];
    scanf("%s", str);// HelloWorld
    printf("%s", str);// HelloWorld
    return 0;
}

上述案例中 我输入HelloWorld和第一个字符串中的%s匹配成功 然后将这个数据转换为二进制表示的字符串 然后将其存入str变量中 我用%s将这个字符串打印到控制台中

6.visual studio无法使用scanf

这个问题的解决参考以下步骤:
1.右击指定文件 选择属性
2.选择C/C++中的预处理器 选择预处理器定义中的编辑
3.接着将_CRT_SECURE_NO_WARNINGS添加到其中即可 点击应用关闭

7.printf和scanf函数的不同

1.printf函数的后续参数不需要加上&取地址符 但是scanf函数的后续参数中基本需要添加取地址符 除了数组名以外
2.对于转换规范和后续参数的对应关系中 printf函数的使用是比较松弛的 因为他允许通过%d将char、short、int类型输出 而对于scanf函数来说 他需要严格对应转换规范和后续参数 否则可能会导致削减字节输出错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/390947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十二)(3)

实验十二:微分方程模型 练习三 1.分别用数值解命令ode23t和ode45 计算示例3中微分方程的数值解,同用命令ode23 算得的数值解以及解析解比较,哪种方法精度较高?你用什么方法比较它们之间的精度? clc;clear; f(x,y)2*yx2; figure(1) [x,y]ode23t(f,[1,2],1); plo…

三、Maven项目搭建及Destination(队列、主题)

Maven项目搭建及Destination(队列、主题) 一、Idea中Maven项目准备1.创建Module2.创建java包3.配置pom.xml 二、队列(Queue)1.JMS编程架构2.代码实现生产者3.代码实现消费者4.队列消费者三大情况 三、消费者类型1.同步式消费者1.1…

【MATLAB】鲸鱼算法优化混合核极限学习机(WOA-HKELM)回归预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 鲸鱼算法优化混合核极限学习机(WOA-HKELM)回归预测算法是一种结合鲸鱼优化算法和混合核极限学习机的混合算法。其原理主要包含以下几个步骤: 初始化&am…

VMware Tools安装教程(适用windows虚拟机)

一、资源 VMware-tools安装包已绑定在资源中 二、步骤 1、点击已经开启的虚拟机中的此图标,点击设置 2、将镜像文件选中,点击确定 3、之后会自动进入安装过程,点击下一步 4、选择典型安装,下一步直到完成,完成后重启…

Swift Combine 合并多个管道以更新 UI 元素 从入门到精通十七

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

【Deep Learning 3】CNN卷积神经网络

🌞欢迎来到机器学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年2月17日&…

Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式 NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性,如果SO_REUSEPORT,比NIO传输更快&#xf…

【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)

文章目录 一、前言二、实验环境三、PyTorch数据结构0、分类1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算…

数字孪生与智慧城市:共筑未来城市的科技基石

一、引言 随着科技的飞速发展,数字孪生与智慧城市已成为未来城市建设的两大关键技术。数字孪生为城市提供了一个虚拟的数字镜像,使我们能全面、深入地了解城市的运行状态。而智慧城市则借助先进的信息通信技术,提升城市的智能化水平&#xf…

算法刷题:复写零

复写零 .习题链接题目描述算法原理初始值步骤1步骤2我的答案: . 习题链接 复写零 题目描述 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素…

【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅

这份技术报告主要关注两个方面:(1)我们的方法将各种类型的视觉数据转化为统一的表示形式,从而实现了大规模生成模型的训练;(2)对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…

CCF编程能力等级认证GESP—C++6级—20231209

CCF编程能力等级认证GESP—C6级—20231209 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)闯关游戏工作沟通 答案及解析单选题判断题编程题1编程题2 单选题…

二叉树入门算法题详解

二叉树入门题目详解 首先知道二叉树是什么: 代码随想录 (programmercarl.com) 了解后知道其实二叉树就是特殊的链表,只是每个根节点节点都与两个子节点相连而其实图也是特殊的链表,是很多节点互相连接;这样说只是便于理解和定义…

安卓TextView 拖动命名

需求:该布局文件使用线性布局来排列三个文本视图和一个按钮,分别用于显示两个动物名称以及占位文本视图。在占位文本视图中,我们为其设置了背景和居中显示样式,并用其作为接收拖放操作的目标 效果图; 实现代码 第一布…

大数据02-数据仓库

零、文章目录 大数据02-数据仓库 1、数据仓库介绍 (1)基本概念 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Sup…

牛客网SQL进阶123:高难度试卷的得分的截断平均值

官网链接: SQL类别高难度试卷得分的截断平均值_牛客题霸_牛客网牛客的运营同学想要查看大家在SQL类别中高难度试卷的得分情况。 请你帮她从exam_。题目来自【牛客题霸】https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45?tpId240&tqId2180…

[Android]Frida-hook环境配置

准备阶段 反编译工具:Jadx能够理解Java语言能编写小型的JavaScript代码连接工具:adb设备:Root的安卓机器,或者模拟器 Frida(https://frida.re/) 就像是你计算机或移动设备的妙妙工具。它帮助你查看其他程序或应用内部发生的事情&#xff0…

OpenAI发布文生视频大模型Sora

关注卢松松,会经常给你分享一些我的经验和观点。 一觉醒来发现自己快失业了,Open AI又放大招了。没有任何消息,没有任何预热,直接王炸。 OpenAI突然发布文生视频大模型Sora,生成一段长达1分钟的高清流畅视频。它能模…

机器学习8-决策树

决策树(Decision Tree)是一种强大且灵活的机器学习算法,可用于分类和回归问题。它通过从数据中学习一系列规则来建立模型,这些规则对输入数据进行递归的分割,直到达到某个终止条件。 决策树的构建过程: 1.…

selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘

Selenium更新到 4.x版本后,以前的一些常用的代码的语法发生了改变 from selenium import webdriver browser webdriver.Chrome() browser.get(https://www.baidu.com) input browser.find_element_by_id(By.ID,kw) input.send_keys(Python)目标:希望通…