模拟登陆密码界面,假如密码输入三次错误则退出程序,scanf()的用法scanf_s 和它的区别

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char key[] = "lixuhui";
	char arr[20] = {0};
	
	int i = 0;
	for (i =3;i>0 && i < 4; i--)
	{
		printf("请输入密码\n");
		scanf("%20s", &arr);
		if (0 == strcmp(key,arr))
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
			printf("你还有%d次机会\n", i-1);
		}
	}
	system("pause");
	return 0;
}

在这里插入图片描述
在这个程序中应注意的是,scanf()的用法,注意到的是scanf_s 和它的区别。

scanf_s的具体用法是以上面程序为例scanf_s("%20s", &arr,20);这样才是正确的。而且这个参数也不是随便给的,它要和你设定的字符数组大小一致。 scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存泄露”这个问题设计的。 scanf_s()用于读取字符串时,必须提供一个数字以表明最多读取多少位字符,以防止溢出。
如果没有参数的话它会停止后面的程序,形成隐蔽的bug,笔者在这找了很长时间才修复。如果错用它会产生警告,程序将无法执行到底,且编译器会提示“Unhandled exception at 0xfefefefe in array.exe:0xC0000005: Access tion.” 让人很蛋疼。想要彻底解决这个问题,参见我的下一篇博文。
笔者在这里不建议使用scanf_s,对初学者来说真的很蛋疼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值