#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,对初学者来说真的很蛋疼。