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.234printf("%hhd %hd %d %ld %lld %f %lf", ch, s, i, l, ll, f, df);// 65 66 67 68 69 1.230000 1.234000return 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,1printf("%d %ld", i, l);// 1 1return 0;
}

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

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

3.scanf函数的具体操作

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

4.几类错误案例

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

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

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

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

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

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

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

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

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

4.避免以上错误

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

5.字符和字符串的输入

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

1.字符的输入

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

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

2.字符串的输入

int main(){char str[10];scanf("%s", str);// HelloWorldprintf("%s", str);// HelloWorldreturn 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.hqwc.cn/news/472860.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024抖店保证金缴纳标准,不懂的快来看!

我是电商珠珠 新的一年到来,意味着新的开始。 很多人想要去兼职或全职一个足不出户的副业,兜兜转转了解到了抖店。 但是对于新手来说,比较关心的还是抖店的保证金缴纳问题,需不需要保证金,需要多少等。 今天&#…

磁体发条概念

使用磁体发条(也称为磁弹簧或磁蓄能器)作为储能装置是一个有趣的概念,它利用电磁感应原理来存储和释放能量。磁体发条的基本原理是通过旋转一个强磁体,使其通过一个线圈的中心,从而在线圈中产生电流。当磁体停止旋转时…

解决ubuntu登录密码问题

解决ubuntu登录密码问题 不要随便删除密码,不要随便改密码,很容导致密码过期,或者密码无效。参考了很多人的做法,都没有得到解决。下面的过程,够详细了,我就是这么搞好的。 1、重启虚拟机,不停…

嵌入式内核链表list_head,如何管理不同类型节点的实现

在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用&#xff0…

MIT-BEVFusion系列八--onnx导出1 综述及相机网络导出

目录 综述export-camera.py加载模型加载数据生成需要导出成 onnx 的模块Backbone 模块VTransform 模块 生成 onnx使用 pytorch 原生的伪量化计算方法导出 camera.backbone.onnx导出 camera.vtransform.onnx 综述 bevfusion的各个部分的实现有着鲜明的特点,并且相互…

springboot198基于springboot的智能家居系统

基于Springboot的智能家居系统 **[摘要]**社会和科技的不断进步带来更便利的生活,计算机技术也越来越平民化。二十一世纪是数据时代,各种信息经过统计分析都可以得到想要的结果,所以也可以更好的为人们工作、生活服务。智能家居是家庭的重要…

走近 Next.js:全栈框架的简介与应用

微信搜索“好朋友乐平”关注公众号。 1. Next.js Next.js 是一个使用 React 构建单页应用程序(SPA)的开源 JavaScript 框架。它使得构建服务端渲染(SSR)和静态网站生成(SSG)的 React 应用程序变得简单和高…

Midjourney绘图欣赏系列(三)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

【教学类-19-09】20240214《ABAB式-规律黏贴18格-手工纸15*15CM-一页3种图案,AB满,纵向、无边框》(中班)

背景需求 利用15*15CM手工纸制作AB色块手环(手工纸自带色彩),一页3个图案,2条为一组,黏贴成一个手环 素材准备 代码展示 # # 作者:阿夏 # 时间:2024年2月14日 # 名称:正方形数字卡…

HTML | DOM | 网页前端 | 常见HTML标签总结

文章目录 1.前端开发简单分类2.前端开发环境配置3.HTML的简单介绍4.常用的HTML标签介绍 1.前端开发简单分类 前端开发,这里是一个广义的概念,不单指网页开发,它的常见分类 网页开发:前端开发的主要领域,使用HTML、CS…

Python setattr函数

在Python编程中,setattr()函数是一个有用且灵活的内置函数,用于设置对象的属性值。它可以在运行时动态地设置对象的属性,无论是新建对象还是已有对象。本文将深入探讨setattr()函数的用法、语法、示例代码,并探讨其在实际编程中的…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之NavRouter组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之NavRouter组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、NavRouter组件 导航组件,默认提供点击响应处理,不需要…