前言
当我们有一个变量,想给变量输入值就可以使用scanf函数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int score = 0;
printf("请输入你的成绩:>");
scanf("%d", &score);
printf("你的成绩为:%d", score);
return 0;
}
一.scanf函数的基本用法
scanf函数用于读取用户从键盘的输入
当程序运行到这行代码,会停下来,等待用户从键盘输入
当用户从键盘输入,并敲下回车键,scanf就会处理数据,并存入变量
当然了使用scanf函数要包含头文件<stdio.h>
接下来给大家介绍scanf的语法
scanf("%d", &i);
它的第一个参数是格式字符串,里面要放占位符,这是因为编译器要提前知道用户要输入的数据类型,这样才能处理数据
注意:变量前面必须加上&运算符(取地址).因为scanf传递的不是值,而是地址,要将变量i的地址指向用户输入的值。就像外卖员要给你送外卖要知道你家的地址一样,这边也一样你的知道变量的地址,才能给他输入值。
下面我将在键盘中输入多个变量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
float j = 0;
float k = 0;
scanf("%d%d%f%f", &x, &y, &j, &k);
printf("%d %d %f %f\n", x, y, j, k);
return 0;
}
为什么我加入空格,scanf也能正确读取。这是因为scanf处理数据时,会自动过滤空白字符,包括空格,制表符和换行符。
所以,用户输入的数据之间,有一个或多个空格不影响scanf解读数据。另外,用户使用回车键,将输入分成几行,也不影响
上面用户分四行输入,当用户每输入一行按下回车键以后,scanf就会去解读数据,如果输入的数据匹配第一个占位符,就会被放进去。那么下次按回车健,就会从第二个占位符开始解读
scanf处理用户输入的原理时,用户输入的先放入缓存区,等按下回车键后,按照占位符进行解读
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完,或者遇到第一个不符合条件的字符为止。
#include <stdio.h>
int main()
{
int x;
int y;
//用户输入” -13.45e12“
scanf("%d%f", &x, &y);
return 0;
}
当scanf读取用户数据时,会忽略开始的空格,当读取到-的时候,编译器会认为读取的时负数,当读取到-13停下来,因为后面的 .不属于整数的有效字符。所以说%d会读到-13。当第二个占位符开始读取时,会从上次停止解读的地方继续放下读,当读到 .的时候,对于%f,就会读取.45e12
二.scanf的返回值
大家可以看一下cplusplus
我们得知了,scanf返回值是一个整数,表示成功读取的变量个数.
如果没有读取任何项,或者匹配失败,则返回0.如果在成功读取任何数据之前,发生了读取错误或者读取到文件结尾,则返回常量EOF(-1).
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
int c = 0;
int ret = scanf("%d%d%d", &x, &y, &c);
printf("%d\n", ret);
printf(" x = %d, y = %d, c = %d\n", x, y, c);
return 0;
}
三.关于scanf的占位符
scanf常用的占位符:
- %c:字符
- %d:整数
- %f:浮点数
- %lf:double类型的浮点数
- %Lf:long double 类型的浮点数
- %s:字符串
- %[]:在方括号里指定一组匹配的字符(比如%[0-9]),遇到不在里面的字符,就停止
上面所有占位符中,除了%c以外,都会自动忽略开始的空白字符。%c不忽略空白字符,总是返回当前的第一个字符。
如果想要强制跳过字符前的空白字符,可以写成scanf(" %c", &n),即%c前加上一个空格,表示跳过零个或多个空白字符
int main()
{
char n;
scanf(" %c", &n);
printf("%c\n", n);
return 0;
}
当scanf讲字符串读入字符数组中,不会检测字符串是否超过了数组长度。这就是scanf不安全的地方,在读取数据的时候,不会看目标空间中能够存的下数据。 为了防止这种情况,,使用%s占位符时,因该指定输入字符串的最大长度,写成%[m]s
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char ch[10];
scanf("%9s", ch); //限制读取字符串的最大长度
printf("%s\n", ch);
return 0;
}
四.scanf的赋值忽略符
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d-%d-%d\n", year, month, day);
return 0;
}
上面的例子,我们可以看到输入2024-2-4,就能正确解读,比如2024/2/4,scanf解析数据就会失败
为了避免这种情况,scanf提供了赋值忽略符,只要把*加在任何占位符 百分号后面,该占位符不会有返回值,解析完就会被丢弃
int main()
{
int year = 0;
int month = 0;
int day = 0;
//赋值忽略符
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d-%d-%d\n", year, month, day);
return 0;
}
这个就是赋值忽略符。