标题:新人求助:安全的密码
只看楼主
另一颗小白菜
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-10-27
结帖率:0
已结贴  问题点数:20 回复次数:4 
新人求助:安全的密码
题目是这样的:
4安全的密码(10分)
题目内容:
随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。
并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。
任务
林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。
应当按照以下的规则来判断密码是否安全:
如果密码长度小于 6 位,则不安全
如果组成密码的字符只有一类,则不安全
如果组成密码的字符有两类,则为中度安全
如果组成密码的字符有三类或以上,则为安全
通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。

输入格式:

输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。

输出格式:

针对每一个密码判断并输出它是否安全。对于不安全的密码输出 "Not Safe",对于中度安全的密码输出 "Medium Safe",对于安全的密码输出 "Safe"

输入样例:
4
1234
abcdef
ABC123
1#c3Gh[回车]

输出样例:
Not Safe
Not Safe
Medium Safe
Safe[回车]

检查不出自己的逻辑错误,三个案例有一个总是过不了QAQ。。请各位大佬帮我看看,感激不尽!
程序代码:
#include<stdio.h>
int main()
{
    char s[40][100]={'\0'};//密码
    int shuzi,daxie,xiaoxie,fuhao;
    int weishu,i,p,N;    
    scanf("%d",&N);
    for(p=0;p<N;p++)
    {
        scanf("%s",&s[p]);
    }
    
    for(p=0;p<N;p++)
    {
        weishu=0;
        shuzi=1;
        daxie=1;
        xiaoxie=1;
        fuhao=1;
    for(i=0;(s[p][i]!='\0')&&i<100;i++)
    {
        weishu++;
        if (s[p][i]>=48&&s[p][i]<=57)
            {
                shuzi=0;
            }
        else if (s[p][i]>=65&&s[p][i]<=90)
            {
                daxie=0;
            }
        else if (s[p][i]>=97&&s[p][i]<=122)
            {
                xiaoxie=0;
            }
        else if(s[p][i]>=32&&s[p][i]<=126)
            {
                fuhao=0;
            }
    }
    i=shuzi+daxie+xiaoxie+fuhao;
    if(i>=3||weishu<6)printf("Not Safe\n");
    else if(i==2)printf("Medium Safe\n");
    else if(i<=1)printf("Safe\n");
    } 
    return 0;
}
搜索更多相关主题的帖子: 安全 输出 组成 密码 字符 
2019-10-29 19:13
另一颗小白菜
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-10-27
得分:0 
我把scanf换成gets之后通过了,但是不明白为什么。。。
2019-10-29 19:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
没有说密码字符不允许是空白字符吧?那么你用scanf("%s"肯定不行呀。

题外话: gets 函数早就被C标准废弃了。
2019-10-29 23:19
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:10 
如果要接受空白字符,还是用gets才管用。楼上大佬说废弃了,那就不知道现在该用哪个了。
2019-10-30 10:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 4楼 yangfrancis
gets 在C99时被废弃,在C11时被移除。

可以用 char* fgets( char* restrict str, int count, FILE* restrict stream ); 其中第三个参数填 stdin。
首先判断其返回值,若是NULL,则可能是输入流结束(此时,feof()返回非零值),也可能是遇到错误(此时,ferror()返回非零值)。
然后判断 str 这个字符串的最后一个字符(不是str这个数组的最后一个字符)---- str[strlen(str)-1] ---- 是否为换行字符('\n'),如果是,则说明读到行末了;如果不是,则说明这一行比较长而接受缓冲区比较小,得继续调用fgets读取此行剩余内容。

char buf[5];
char* p = fgets( buf, sizeof(buf), stdin );
为例,
如果 输入a并回车,那么 buf 的内容是 'a','\n','\0'
如果 输入ab并回车,那么 buf 的内容是 'a','b','\n','\0'
如果 输入abc并回车,那么 buf 的内容是 'a','b','c','\n','\0'
如果 输入abcd并回车,那么 buf 的内容是 'a','b','c','d','\0'。可以看出'\n'并没有被接收到,如果再次调用char* p = fgets( buf, sizeof(buf), stdin )的话,buf 的内容是 '\n','\0'
如果 输入abcde并回车,那么 buf 的内容是 'a','b','c','d','\0'。可以看出'\n'并没有被接收到,如果再次调用char* p = fgets( buf, sizeof(buf), stdin )的话,buf 的内容是 'e'、'\n','\0'
总结一下,fgets比gets多个count参数,可以防止缓冲区溢出;fgets与gets相比多保留个'\n'字符以判别是否一行读结束。

当然,直接用 scanf 也可以,例如
char s[100];
scanf( "%[^\n]%*c", s );
输入"a b c"并回车,那么s的内容就是"a b c"
2019-10-30 11:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497501-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.234260 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved