scanf函数(多组输入问题)

前言

 以下内容使用Visual Stdio 2022集成开发环境,配置系统为Windows 11,内容仅针对初学者。


目录

一、scanf函数

Ⅰ、scanf函数的输出格式

Ⅱ、scanf函数不安全性的问题

Ⅲ、scanf函数多组输入问题(在线oj试题)

Ⅳ、两个scanf函数连用问题


一、scanf函数

Ⅰ、scanf函数的输出格式

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。当我们需要使用时需要引入stdio.h头文件。scanf函数的一般调用形式如下:

scanf("格式字符",输入列表的地址);

如下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	float a = 0;
	int b = 1;
	char arr[10] = { 0 };
	scanf("%f 的 %d",&a,&b);
	printf("%f %d\n", a, b);
	printf("-------------------\n");
	scanf("%s", arr);
	printf("%s\n", arr);
	return 0;
}

结果如下:

 第一行与第四行是输入,在scanf函数的输入列表里有什么字符,输入的时候也必须输入对应的字符,否则数据对不上导致结果错误。如下图

 Ⅱ、scanf函数不安全性的问题

①在以上代码会发现第一行有一个宏定义#define _CRT_SECURE_NO_WARNINGS,意思是忽略scanf不安全性的问题。

②在Visual Studio中scanf不安全性的原因:scanf不会对放数据的空间进行检测,可能导致输入的数据空间大于原有的数据空间,出现报错,所以scanf不安全。

③可以使用scanf_s函数代替scanf函数,scanf_s是Visual Studio开发工具提供的一个功能与scanf函数相同的安全标准输入函数。

④虽然可以使用scanf_sscanf_s是VS提供的开发工具,在其他编译器不一定能使用,所以可移植性底,不建议在项目中使用,平常写写代码就行了。

Ⅲ、scanf函数多组输入问题(在线oj试题)

注:必须了解循环

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	int i = 0;
	while ((scanf("%d", &a)) != EOF)
	{
		printf("输入%d次,a = %d\n", i, a);
		i++;
	}
	return 0;
}

结果:

EOF的英文为end of file,意思为文件结束标志(即在文件末尾都隐式存在这个标志),EOF也是一个标识符常量,定义形式为#define EOF -1,这个常量的值为-1。

②当程序还在运行时scanf函数的返回值总为非EOF,所以当程序运行时循环一直进行。

③可以使用ctrl Z + 回车(三次)使得scanf函数返回EOF,ctrl Z是在windows系统下输入EOF标记的方式。

Ⅳ、两个scanf函数连用问题

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	char i = 0;
	scanf("%d", &a);
	scanf("%c", &i);
	printf("输出:%d\n", a);
	printf("输出:%c\n", i);
	return 0;
}

结果:

 可以看到我们只输入了一个1程序就结束了,预期结果应该是输入两个数据。

①在需要连续输入数据时,如果第二个输入的数据是单个字符,那么再输入第一个数据之后回车,程序默认回车字符作为你第二个数据,而在ASCII码中回车字符('\n')的值为10,所以由此解释两个scanf连续输入的问题。

②在使用scanf连续输入时尽量避免字符输入在后面,不然会导致回车字符被吸收而影响最终结果。

③解决方案:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	char i = 0;
	scanf("%d", &a);
	getchar();
	scanf("%c", &i);
	printf("输出:%d\n", a);
	printf("输出:%d\n", i);
	return 0;
}

结果:

getchar()函数:输入单个字符,并返回。

在进入到第二个字符输入scanf函数之前,先把回车字符用getchar()吸收,便不会影响到数据的输入。

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒夕君哎

动力+99(*•̀ᴗ•́*)و

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值