早教吧 育儿知识 作业答案 考试题库 百科 知识分享

C检测安全密码网上流传一句话:"常在网上飘啊,哪能不挨刀啊~".其实要想能安安心心地上网其实也不难,学点安全知识就可以.首先,我们就要设置一个安全的密码.那什么样的密码才叫安全的

题目详情
C 检测安全密码
网上流传一句话:"常在网上飘啊,哪能不挨刀啊~".其实要想能安安心心地上网其实也不难,学点安全知识就可以.
首先,我们就要设置一个安全的密码.那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16.
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组.
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码.

Input
输入数据第一行包含一个数M,接下有M行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符.

Output
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO.

Sample Input
3
a1b2c3d4
Linle@ACM
^~^@^@!%

Sample Output
NO
YES
NO
我的代码在自己电脑上测试能顺利通过,为什么就是没法AC
#include
#include
int main()
{
int a,i,j;
char s[51];
scanf("%d",&a);
for(i=0;i=8&&strlen(s)
▼优质解答
答案和解析

switch(1)
  {
case 1:if(s[j]>='a'&&s[j]<='z')  flag[0]=1;
case 2:if(s[j]>='A'&&s[j]<='Z')  flag[1]=1;
case 3:if(s[j]>='0'&&s[j]<='9')  flag[2]=1;
case 4:if(s[j]=='~'||s[j]=='!'||s[j]=='@'||s[j]=='#'||s[j]=='$'||s[j]=='%'||s[j]=='^') flag[3]=1;
}

这个写法真奇葩 不过原则上来说 虽然看着别扭 但是这部分还真没问题

你这个代码不能AC的原因在于getchar的位置

在for(i=0;i<a;i++)开头 你调用了一个getchar

想必是要用它略去输入a时候的回车 这个想法是正确的

可是接下来循环中用的是gets 这个函数可不会剩下个回车给你 

再getchar就把下一个输入的第一个字符给略去了

所以在多组输入下 就可能出错了

比如

1asfasdfD这个输入 如果不放在第一个 就会输出NO 但实际上它是YES

再如sdfVX~11 如sdf~sdJSSUUd12456

都会输出错误


修改方式

把getchar移到for上面就可以了

你试试吧

修改后代码 switch那段我就不改了

#include
#include
int main()
{
int a,i,j;
char s[51];
 scanf("%d",&a);
  getchar();//move to here
 for(i=0;i {
     gets(s);
   if(strlen(s)>=8&&strlen(s)<=16)
   {
   int flag[4]={0,0,0,0};
      for(j=0;j      {
   switch(1)
   {
 case 1:if(s[j]>='a'&&s[j]<='z')  flag[0]=1;
 case 2:if(s[j]>='A'&&s[j]<='Z')  flag[1]=1;
 case 3:if(s[j]>='0'&&s[j]<='9')  flag[2]=1;
 case 4:if(s[j]=='~'||s[j]=='!'||s[j]=='@'||s[j]=='#'||s[j]=='$'||s[j]=='%'||s[j]=='^') flag[3]=1;
}
 }
 if(flag[0]+flag[1]+flag[3]+flag[2]>=3)
 printf("YES\n");
 else
 printf("NO\n");
   }
   else printf("NO\n");
 }
}
看了 C检测安全密码网上流传一句话...的网友还看了以下: