在给给变量输入值时,我们需要用到scanf。scanf()函数用于读取用户键盘输入,当用户按下回车键时,输入量会存入变量中。
scanf的基本用法
其用法与printf类似。
int c=0;
scanf("%d",&c);
&为取地址符,就是把输入的变量存入c的地址中。
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
scanf()处理用户输入的原理,用户的输入先放入缓存区,当按下回车键后,按照占位符对缓存进行解读。
解读用户输入时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条 件的字符为⽌。
#include <stdio.h>
int main()
{
int x;
float y;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y);
return 0;
}
上⾯⽰例中, scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读 取到 -13 停下来,因为后⾯的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 。 第⼆次调⽤ scanf() 时,就会从上⼀次停⽌解读的地⽅,继续往下读取。这⼀次读取的⾸字符 是 . ,由于对应的占位符是 %f ,会读取到 .45e12 ,这是采⽤科学计数法的浮点数格式。后⾯的 # 不属于浮点数的有效字符,所以会停在这⾥。
关于scanf的多个占位符的示例,可参考上一篇printf,于其用法差不多。
scanf("%d%f",&a,&b)
scanf的返回值
scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量 -1,也就是EOF。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float f = 0;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);
return 0;
}
在vs中输入三次CTRL+Z才会结束输入,输入2个数,返回值r=2,如果一个数也不输入返回值就是-1。
赋值忽略符
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d:%d:%d", &a, &b, &c);
printf("%d %d %d\n", a, b, c);
return 0;
}
上⾯⽰例中,如果⽤⼾输⼊1:2:3 ,就会正确解读1:2:3。问题是⽤⼾可能输⼊其他 格式,⽐如 1 2 3,这种情况下, scanf() 解析数据就会失败。因此scanf提供了赋值忽略符*。
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d%*c%d%*c%d", &a, &b, &c);
printf("%d %d %d\n", a, b, c);
return 0;
}
上⾯⽰例中, %*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表⽰这个占位符没有对应的 变量,解读后不必返回。这个%c是上式中:。