深入了解scanf函数

前言

当我们有一个变量,想给变量输入值就可以使用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;
}

在这里插入图片描述
这个就是赋值忽略符。

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值