目录
4.2 scanf 函数
在前一篇文章中,我们了解到输出函数可以使用printf函数,输入函数要使用什么呢?在c语言中,输入函数一般使用scanf函数,用于读取用户的键盘输入。
4.2.1 scanf基本用法
在程序运行这个语句时,程序会停下来,等待用户输入,用户输入数据后,按下回车键,程序会对用户输入的值进行处理,并返回对应的变量,使用时同样需要引入头文件stdio.h,与printf()函数类似
printf函数第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符,占位符的作用是让编译器理解用户的输入及需要提取的数据类型,他的其余参数用于存放用户输入的变量,格式字符串中有多少个占位符对应后面有多少个参数 ,上述图片中,scanf的第一个参数是%d,表示用户输入的是一个整数,第二个参数是&i,将用户输入的整数存入到变量i中
变量前必须加取地址运算符&,因为scanf函数传递的不是值,是地址,是将变量i的地址指向用户输入的值,如果这里的变量是指针变量(例如字符串变量),就不用加取地址运算符&
4.2.2scanf()数据的读取原则
scanf()处理数值占位符时,会自动过滤掉空白字符包括空格,制表符,执行符等,所以在输入数据是,一个或多个空格或者将输入分为几行,都不会影响解读数据
由上图知, scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从1处开始获取数据,读取到12停下来,因为后⾯的 . 不属于整数的有效字符。也就是说,占位符 第1次调⽤ %d 会读到12 ,第二次调用 scanf() 时,就会从上⼀次停⽌解读的地⽅,继续往下读取。这⼀次读取的⾸字符 是 . ,由于对应的占位符是 %f ,会读取到 .34e10,这是采⽤科学计数法的浮点数格式(是指0.34*10^10)。后⾯的 # 不属于浮点数的有效字符,所以会停在这⾥。
4.2.3 scanf的返回值
scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量EOF(EOF为-1)。
输完3个数时,按回车
如果输⼊2个数后,按 ctrl+z ,提前结束输⼊:
如果输⼊1个数后,按 ctrl+z ,提前结束输⼊:
输入不符合要求的数据
在VS中按3次 ctrl+z ,才结束了输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF
4.2.4 占位符
scanf常用占位符
%c :字符
%d :整数。
%f : float 类型浮点数。
%lf : double 类型浮点数。
%s :字符串。
注 除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。
占位符 %s ,从当前第⼀个⾮空⽩ 字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。 因为 %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个 %s ⼀起使⽤。意味着, scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。
4.2.5赋值忽略符
下图中,如果⽤⼾输⼊ 格式,⽐如 2023-3-2 ,就会正确解读出年、⽉、⽇。
但用户如果错误输⼊其他 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符 只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
%*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表⽰这个占位符没有对应的 变量,解读后不必返回
好啦,关于scaanf函数的内容就结束了