C语言scanf函数详解..

news2024/11/24 18:43:51

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函数来说 他需要严格对应转换规范和后续参数 否则可能会导致削减字节输出错误

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda管理python库 不太推荐 pyenv管理Python不同版本教程(本人另一篇博客,姊妹篇) 0.前提 ①anaconda、miniconda在win上推荐前者,在linux上推荐后者&#xff0…

随机过程及应用学习笔记(一)概率论(概要)

概率是随机的基础,在【概率论(概要)】这个部分中仅记录学习随机过程及应用的基本定义和结果。 前言 首先,概率论研究的基础是概率空间。概率空间由一个样本空间和一个概率测度组成,样本空间包含了所有可能的结果&…

LCR 127. 跳跃训练【简单】

LCR 127. 跳跃训练 题目描述: 今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子,每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中,学员们共有多少种不同的跳跃方式。 结果可能过大,因此结果…

Transformer——Attention 注意力机制

注意力机制 Transformer的注意力机制借鉴了人类的注意力机制。人类通过眼睛的视觉单元去扫描图像,其中的重点区域会被大脑的神经元处理从而获得更多的信息,这是人类长期精华所获得的一种能力。 以论文中的例子来看,红色区域表示我们人脑视觉…

linux内核模块find_module()函数详解--02

亲爱的粉丝朋友们大家好,为了更好的服务大家,提升分析问题和解决问题的能力,先针对Linux内核里面的API函数进行详细分析,并利用案例进行说明,加强对内核API函数的认识。 第一:函数原型 //头文件包含 #incl…

晨曦记账本,微信账单全解析,轻松掌握收支明细与总花销!

在这个数字化时代,微信已不仅仅是一个简单的社交工具,更是我们日常生活中不可或缺的支付与收款平台。从购买早餐、支付水电费到线上购物,微信支付已经渗透到我们生活的方方面面。然而,你是否曾经对自己的微信消费产生过疑惑&#…

线程的状态与切换

文章目录 线程的状态与切换一、线程的状态1、操作系统层面(5种)2、Java_API层面(6种) 二、让出时间片 - yield三、线程插队 - join1、源码分析2、应用1 - 等待线程结果3、应用2 - 控制执行顺序 四、计时等待 - sleep五、等待唤醒 …

2024春节联欢晚会刘谦魔术分析

春晚已经越来越拉胯了,看着节目单没一个能打的,本来想说:办不起,就别办呗。 没想到第二天刘谦的魔术以一种很奇特的姿势火起来了,干脆蹭个热度,分析下魔术的原理。 魔术1 这个不算什么新奇的节目&#xf…

老师的“神秘武器”——教育战线的宝藏工具

每次考试成绩发布,是不是总让你头疼不已?面对一摞摞试卷,一个个需要手动输入的成绩,你是否也感到力不从心?别急,今天我就为大家揭秘老师们的“神秘武器”——那些在教育战线上,让老师们事半功倍…

代码随想录刷题笔记-Day18

1. 合并二叉树 617. 合并二叉树https://leetcode.cn/problems/merge-two-binary-trees/ 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)…

【图像分割 2024】ParaTransCNN

【图像分割 2024】ParaTransCNN 论文题目:ParaTransCNN: Parallelized TransCNN Encoder for Medical Image Segmentation 中文题目:用于医学图像分割的并行TransCNN编码器 论文链接:https://arxiv.org/abs/2401.15307 论文代码:H…

机器学习西瓜书之决策树

目录 算法原理剪枝处理连续值处理缺失值处理多变量决策树 算法原理 从逻辑角度:通过一系列if-else语句进行多重判断,比如白富美的判断条件(“白”“富”“美”)。 从几何角度:根据定义的标准进行样本空间的划分。 以二…

应对DDoS攻击:快速恢复网站正常运行的关键步骤

当网站遭受DDoS(分布式拒绝服务)攻击时,可能会导致网站停机、性能下降和用户无法访问等问题,处理DDoS攻击需要采取一系列措施来应对和缓解攻击。 您的网站可能是今天的目标,因为面对DDoS(分布式拒绝服务&am…

【Vue前端】vue使用笔记0基础到高手第2篇:Vue知识点介绍(附代码,已分享)

本系列文章md笔记(已分享)主要讨论vue相关知识。Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)

效果演示 文章目录 效果演示系列目录前言拖放、交换物品绘制拖拽物品插槽UI修改Inventory,控制拖放功能 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xf…

C语言第二十六弹---字符串函数(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、strncat 函数的使用 2、strncmp 函数的使用 3、strstr 函数的使用和模拟实现 4、strtok 函数的使用 5、strerror 函数的使用 6、perror 函数的使用…

CSS的注释:以“ /* ”开头,以“ */ ”结尾

CSS的注释:以“ /* ”开头,以“*/”结尾 CSS的注释: 以“ /* ”开头,以“ */ ”结尾 在CSS中,注释是一种非常重要的工具,它们可以帮助开发者记录代码的功能、用法或其他重要信息。这些信息对于理解代码、维护代码以及与他人合作都…

【C++11】:unordered系列关联式容器

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关unordered系列关联式容器的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:…

HarmonyOS一杯冰美式的时间 -- 验证码框

一、前言 像是短密码、验证码都有可能需要一个输入框,像是如下: 恰好在写HarmonyOS的时候也需要写一个验证码输入框,但是在实现的时候碰了几次灰,觉得有必要分享下,故有了此篇文章。 如果您有任何疑问、对文章写的不…

【MySQL】多表关系的基本学习

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…