格式:
*使用的是VS2022,所以需要用到scanf_s
9.2.1 基本用法
1.scanf()函数可以读取用户的键盘手动输入
原型定义在头文件 stdio.h 中
scanf()语法和printf()语法类似
eg.
scanf("%d",&a);
2.scanf()函数一次可以输入多个变量
举个栗子:
3.scanf()在处理数值占位符时,会自动过滤掉空白字符,包括空格、制表符、换行符等
比如:
4.scanf()处理用户输入的原理:用户的输入先放入缓存,等按下回车键,再按照占位符对缓存内容进行解读(遇到第一个不符合条件的字符就停止)
*补充:12e7==12*10的7次方
9.2.2 scanf的返回值
1.scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,返回0;
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(EOF=-1)故最后结果返回-1。
举个栗子:
1)在VS中按三下ctrl+z ,才结束输入
2)如果一个数字都不输入,直接按3次ctrl+z,输出的r是-1,也就是EOF。
2.输入的格式(和中英文标点符号)要与占位符的格式(和中英文标点符号)相同才能输出正确的值!
1) 格式错误
2)中英文标点符号不同
3)正确格式
9.2.3 占位符
scanf()常用的占位符如下,与printf()的占位符基本一致。
•%c:字符。
• %s:字符串。
•%d:整数。
•%f:float 类型浮点数。
• %lf:double 类型浮点数。
•%Lf:long double 类型浮点数。
•%[ ]:在方括号中指定一组匹配的字符 (比如 %[0-9〕) ,遇到不在集合之中的宇符,匹配将会停止。
1.%c的特殊用法
上面所有占位符之中,除了%c 以外,都会自动忽略起首的空白字符。%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
%d举例
输入时前面有空格,但%d不读取空格,所以输出时没有空格
%c举例
输入时前面有空格,而%c读取空格,所以输出为空格
如果要强制跳过字符前的空白字符
可以写成 scanf(" %c",&ch),即%c 前加上一个空格,表示跳过零个或多个空白字符。
2.%s的特殊说明
它其实不能简单地等同于字符串。
它的规则是:从当前第一个非空白宇符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
1) %s无法读取空格,所以无法读入多个单词。除非多个%s一起用。
所以canf()不适合读取可能包含空格的宇符串,比如书名或歌曲名。
另外,scanf()遇到 %s 占位符,会在字符串变量未尾存储一个空字符 \0。
2)scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。(这也是scanf()不安全的原因)
所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用%s 占位符时,应该指定读入字符串的最长长度,即写成%[m]s,其中的[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
9.2.4 赋值忽略符
由9.2.2.1得,在使用scanf()时输入格式要与占位符的格式相同,但我们很难时刻做到这一点,为了方便,scanf()提供了一个赋值忽略符 *。只要把*加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
没有赋值忽略符之前:
有赋值忽略符之后
▲关于scanf与scanf_s的用法解释
scanf_s是VS 2022 中提供的,C语言不提供。所以其他编译器无法识别scanf_
▲scanf在VS中的正确用法:
在代码的第一行写#define _CRT_SECURE_NO_WARNINGS 1
▲Q:每次写这一行太不方便,有什么方法自定加呢?
A:首先我们要了解VS在新建文件时,都是拷贝newc++file.cpp 这个文件。
所以如果我们在newc++file.cpp文件的第一行加上#define _CRT_SECURE_NO_WARNINGS 1 这句话,那么以后新建的文件中自然就有这句代码了!!
▲具体步骤:
推荐一个软件:Everything(用来搜索文件)
在Everything中搜索 newc++file.cpp (路径为VS2022)
用记事本打开
在第一行写上#define _CRT_SECURE_NO_WARNINGS 1
保存ctrl+s
新建VS文件时,要打开显示紧凑视图来建立C++文件!
▲VS认为不安全的函数还有:
strcpy
strcat