你需要知道的scanf函数用法

作者&投稿:贾肥 (若有异议请与网页底部的电邮联系)
~

这一节,我们就来介绍与printf相反的scanf函数。

printf函数将二进制表示的整数、浮点数、字符、字符串等按照转换规范转换成字符,并打印在控制台上。与之相反,scanf将键盘输入的字符串根据转换规范,转换成二进制表示的整数、浮点数、字符或字符串等。

运行程序后,在键盘输入:“1 2 3 4 5.6 7.8”。scanf函数,将字符串"1 2 3 4 5.6 7.8",根据转换规范,分别转换为各类二进制数据,并存储到变量中。

printf函数将这些变量,按照转换规范,再转换为字符串,输出到控制台。

1. scanf函数的使用公式

scanf是一个变参函数。

scanf的第一个参数是字符串。

scanf的第一个参数内容为匹配字符以及转换规范。

scanf的后续参数,是转换完成后,数据的存放位置。

转换规范的写法与数量,需要与后续的参数类型和数量对应。

1.1 scanf是一个变参函数

和printf一样,scanf也是一个变参函数。之前我们也说了,变参函数中参数的数量和类型不确定。

1.2 scanf的第一参数是字符串

1.3 scanf的第一个参数为匹配字符以及转换规范。

请注意:输入时,需要按照第一个字符串的形式进行输入,否则无法得到正确结果。

例1: scanf第一个字符串为"%hhd %hd %d %ld %f %lf",每个转换规范使用空格分割。那么输入时需要用空格进行分割,形如1 2 3 4 5.6 7.8。

例2: scanf第一个字符串为"%hhd,%hd,%d,%ld,%f,%lf",每个转换规范使用,分割。那么输入时需要用逗号进行分割,形如1,2,3,4,5.6,7.8。

例3: scanf第一个字符串为"%hhd+%hd-%dx%ld/%f\~%lf",转换规范使用+-x/~分割。那么需要像这样输入1+2-3x4/5.6~7.8。

总而言之,scanf会将输入的字符串与第一个参数进行匹配,从而找到需要转换的部分。 若字符串匹配失败,将无法得到正确的转换结果。

1.4 scanf的后续参数,是转换完成后,数据的存放位置。

scanf将输入的字符串按照对应的转换规范进行转换,转换完成后的二进制,将依次存放到后续参数所输入的变量地址当中。暂时这里不讨论什么是变量的地址,请记住两个规则:

如果scanf将转换后的二进制存储到基本变量当中,请在变量名前加&。 

如果scanf将字符串存储到字符数组中,字符数组名不用加&。

1.5 转换规范的写法与数量,需要与后续的参数类型和数量对应。

2. scanf函数具体做了什么

2.1 将输入字符串与第一个参数进行匹配

首先,scanf函数读取到输入的字符串。 接着,scanf会将这个输入字符串与第一个参数的字符串进行匹配,找到输入字符串中的子串与转换规范的一一对应关系。

子串"1"对应转换规范"%hhd" 子串"2"对应转换规范"%hd" 子串"3"对应转换规范"%d" 子串"4"对应转换规范"%ld" 子串"5.6"对应转换规范"%f" 子串"7.8"对应转换规范"%lf"

2.2 根据转换规范将字符转换为二进制

子串与转换规范匹配好之后就开始转换环节。scanf将根据子串对应的转换规范,使用不同的转换方式,将子串转换为二进制。

不同转换规范代表的转换方式如下表:

根据上表,对照我们的例子中的转换方式如下。

子串"1"对应转换规范"%hhd",将转换为char类型的二进制表示,1字节。 

子串"2"对应转换规范"%hd",将转换为short类型的二进制表示,2字节。 

子串"3"对应转换规范"%d",将转换为int类型的二进制表示,4字节。 

子串"4"对应转换规范"%ld",将转换为long类型的二进制表示,4字节。 

子串"5.6"对应转换规范"%f",将转换为float类型的二进制表示,4字节。 

子串"7.8"对应转换规范"%lf",将转换为double类型的二进制表示,8字节。

2.3 将转换后的二进制放入变量

得到转换后的二进制后,将这些二进制根据顺序,依次放入变量当中。

由于我们使用了对应类型的变量来接收转换结果,所以长度和类型均可以保证一致。

3. 几类错误示范

3.1 长度正确但类型错误

我们输入了字符串"123.45",该字符串被转换规范"%lf"匹配。

接下来,字符串"123.456"将被转换为double类型的二进制表示,8个字节。

最后,这8个字节被送给了long long类型的变量ll。

现在变量ll是一个装有double类型二进制的整型了。

我们使用%d来打印ll肯定出现了错误的结果。

那我们使用%f来打印呢?%f将取8个字节的二进制,并且按照double类型二进制规则进行转换。结果就得到了正确的结果。

3.2 输入字符串数值大于转换类型取值范围

我们输入了字符串"2147483467",该字符串被转换规范"%hd"匹配。

接下来,字符串"2147483467"将被转换为short类型的二进制表示,2个字节。

而short类型的取值范围为-32767~32768,2147483467无法用short装下。

所以,无法得出正确的结果。

3.3 变量放不下转换结果

我们输入了字符串"2147483467",该字符串被转换规范"%d"匹配。

接下来,字符串"2147483467"将被转换为int类型的二进制表示,4个字节。

最后,转换后的4个字节的数据被short类型的变量s接收,丢失了2个字节。

所以,无法得出正确的结果。

3.4 如何避免错误

我们输入了字符串"2147483467",该字符串被转换规范"%d"匹配。

接下来,字符串"2147483467"将被转换为int类型的二进制表示,4个字节。

最后,转换后的4个字节的数据被int类型的变量n接收。

正确结果。

使用scanf的时候请注意,输入字符串的数值与转换规范和接收转换结果的变量类型必须匹配才能得到正确结果。

4. 字符和字符串

4.1 输入字符

我们来试试看输入一个字符吧。

我们输入了字符串"A",该字符串被转换规范"%c"匹配。

接下来,字符串"A"将被转换为char类型的二进制表示(其十进制为65),1个字节。

最后,转换后的1个字节的数据被char类型的变量c接收。

当我们用%d打印c时,输出了数值65。而用%c打印时,输出了字符c。

如果要给char类型输入数值,请使用转换规范hhd。若还是使用转换规范c。会将第一个字符的ASCII码装入变量。

4.2 输入字符串

c语言中没有字符串变量,字符串被存储在字符数组当中。

由于这里是将输入的字符串存储到字符数组中,后面的参数str不加&。

目前我们还没有讨论过数组,暂时不继续展开这一部分内容。

5. VS无法使用scanf函数

如果你使用的是较新版本的Visual Studio,scanf这类函数会被认为是不安全的,编译器会抛出C4996错误,并建议你使用别的安全函数替代。

但是,目前我们并不想引入并讨论这一类安全函数。请将_CRT_SECURE_NO_WARNINGS加入预定义字符串,屏蔽不安全函数错误。

添加步骤方式如下:

解决方案下,工程点右键,进入属性。

展开C/C++,选择预处理器。

点击预处理器定义【编辑】。

将_CRT_SECURE_NO_WARNINGS加入预处理定义。

6. scanf与printf的不同

printf的后续参数不要加&,而scanf由于需要一个地址,所以对于基本变量需要加&,数组则不需要。  

printf的参数由于比int小的变量会升级为int,float会升级为double。所以,转换规范d可以用于char,short,int。转换规范f可以用于float和double。但是scanf是直接把转换结果送到接收变量中,必须严格使用转换规范。




scan是什么意思
scan意思如下:SCAN,英文单词,及物动词、不及物动词、名词,作及物动词时意为“扫描;浏览;细看;详细调查;标出格律”,作不及物动词时意为“扫描;扫掠”,作名词时意为“扫描;浏览;审视;细看”。单词发音 英[skæn]美[skæn]短语搭配 Auto Scan 自动扫描 ; 自动扫描系统 ; ...

scan什么意思
SCAN的字面意思就是“细看、审视”,那么放在汽车上的SCAN按键,则是代表扫描,用来搜索无线电台,当搜索完毕之后就会立即停止。但通常来说,只有较为老款的车型,才会设有SCAN实体按键。汽车上的SCAN按键,则是代表扫描,用来搜索无线电台,当搜索完毕之后就会立即停止。SCAN:在CD播放状态下按此按钮,显示...

scan指示灯是什么意思
首先,要了解scan指示灯是什么意思。scan指示灯通常出现在扫描仪或打印机上,是一种用于指示设备工作状态的灯光。当用户启动设备时,scan指示灯会开始闪烁,表示设备正在准备工作。其次,scan指示灯也可以用于指示设备的故障。如果用户在使用设备的过程中遇到问题,例如打印机卡纸或扫描仪无法正常工作,此时scan...

全扫描scan的特点
全扫描scan的特点是对整个色谱检测过程的所有流出离子都时刻扫描,能完整的反应整体所有组分。根据查询相关资料信息显示,scan扫描就是全谱图扫描,主要用来做未知化合物的定性分析,对质谱的扫描范围进行全扫描,得到完全的质朴图。

scan是什么按钮?
SCAN的意思就是“审视、细看”,在汽车上的SCAN按键是代表扫描,是用来搜索无线电台的。搜索完毕之后就会马上停止。但一般只有老款的车型才会有SCAN这个按键。MODE按键用来切换多媒体模式,一般在FM\/AM\/在线电台\/USB\/本地\/蓝牙音乐等模式下循环切换(具体需根据车型来决定)。MUTE按键用来控制多媒体的静音...

scan和skim区别是什么?
Scan是指有目的地寻找某些特定信息。通常是通过快速浏览文章中的关键词、数字、日期、名字等来实现的。通常用于读者想要找到所需的信息,以便更快地完成任务或解决问题。五、双语例句 skim 1、Skim the jam and let it cool.撇去果酱上的浮沫,让它冷却。2、Skim the scum off the jam and let it...

“scan”和“skim”的区别是什么?
scan和skim的区别:意思不同、用法不同、侧重点不同 一、意思不同 1.scan意思:vt. 扫描;浏览;审视;细看 vi. 合韵律;划分音步 n. 扫描;浏览;细看 2.skim意思:vt. 撇去;略读;掠过;滑过 vi. 掠过;表面凝结 n. 浮沫;略读;脱脂物 二、用法不同 1.scan用法:基本含义是“看,扫视...

扫描仪上的scan是什么意思
就是扫描的意思。file 文件 copy 复制,拷贝 scan 扫描 ocr 光学符号识别,光学文字识别机,光学符号阅读器 E-mail 电子邮件

scan的区别是什么?
scan和skim的区别:1、定义不同。scan v. 浏览,指粗略地扫视报刊文章等,以便了解主要内容,含较强的目的性。skim v. 浏览,略读。指快速阅读以找出要点或主要信息。2、后跟介词不同。scan 后跟 through;而skim常后接介词 through\/over。3、举例比较:He scanned through the newspapers and found ...

scan和skim有什么区别?
这两个单词我知道了,就让为师来告诉大家吧~~嗯,大家先看一下我总结的这个对比表格~~ 下面具体分析一下两个单词在含义、用法方面的区别~~ 1、含义不同 (1)scan 的含义。 scan 读音是:英[skæn] 美[skæn] 音标一样的哦。 作及物动词、不及物动词、名词。作及物动词时意为“扫描;浏览;细看;详细...

金安区15331377265: 关于scanf的用法 -
贺傅硫酸: 呵呵,其实我不懂,借鉴网友: nestalc 的回答,如有不明之处,可以加他好友询问下! scanf 格式输入函数 函数作用:按照变量在内存的地址将变量值存进去. 一般格式:scanf(格式控制,地址表列) 其中,格式控制: %d:以带符号的十...

金安区15331377265: C语言scanf用法 -
贺傅硫酸: scanf是C语言中的一个输入函数,与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include .(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include .)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中.scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF.

金安区15331377265: Scanf()函数的使用 -
贺傅硫酸: scanf(格式控制,地址表列) int scanf(char *format[,argument,...]); “格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址. scanf()函数返回成功赋值的数据项数,读到文件末尾...

金安区15331377265: c语言中的scanf 函数的用法 -
贺傅硫酸: 输出的值只是空格前面的字符是因为scanf函数的输入格式错误,输入参数的变量前需要加&.scanf("%s",s);改为scanf("%s",&s); scanf的用法是:scanf("格式控制字符串",输入参数一,输入参数二);格式控制字符串包含:格式控...

金安区15331377265: c语言中scanf函数的用法 -
贺傅硫酸: 比如int i; scanf("%d",&i);//&是取地址运算符,取i的地址 又如int a[10]; scanf("%d",a);//数组名本身就是一个数组的首地址 总结就是scanf(" 格式控制", 地址);

金安区15331377265: 关于scanf函数和printf函数的用法与区别(菜鸟级提问!!) -
贺傅硫酸: 1.区别:scanf与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>.它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中.而printf()函数是格式化输出函数, 一般用于向...

金安区15331377265: C语言中的scanf函数怎么用呀? -
贺傅硫酸: scanf("字符串,确定输入的类型",变量地址); example: int a; scanf("%d",&a);%d,%f,%lf,%c,%s分别表示int,float,double,char,字符串.根据你输入变量的类型选择.

金安区15331377265: C语言中,scanf应该怎样运用? -
贺傅硫酸: 这是一个格式化输入函数,即输入数据时可以指定格式. 如:1.输入一个整数到int型变量a:scanf("%d",&a);这里“%d”表示以int型格式接收用户输入的数据到int型 变量a.2.scanf("%c",&b);表示以字符型char格式接收用户输入的数据存到char型变量b.

金安区15331377265: scanf 如何换行输入? -
贺傅硫酸: scanf可以手动换行输入.即在键盘上的输入顺序为:5 回车 9. scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”.该函数的原型为: # include <stdio.h> int scanf(const char *format, ...); 它有两种用法,或者说有两种格式....

金安区15331377265: C语言中,scanf应该怎样运用? -
贺傅硫酸: scanf()和printf()是一对输入输出函数,它们都使用格式化的字符串来约束,如用 %d 表示整型用%ld表示长整型scanf()强调对指定位置的写入,因此,从第2个参数开始应该是一个能表示地址的表达式,如&a表示变量a所指向的地址希望回答对你有帮助

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网