PAT Basic 1081. 检查密码

发布时间 2023-04-11 11:24:44作者: 十豆加日月

PAT Basic 1081. 检查密码

1. 题目描述:

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。

2. 输入格式:

输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。

注意: 题目保证不存在只有小数点的输入。

3. 输出格式:

对每个用户的密码,在一行中输出系统反馈信息,分以下5种:

  • 如果密码合法,输出Your password is wan mei.
  • 如果密码太短,不论合法与否,都输出Your password is tai duan le.
  • 如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.
  • 如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.
  • 如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.

4. 输入样例:

5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6

5. 输出样例:

Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

考察基础IO,有几处细节还是需要注意下:

  • 这里需要用getchar()消耗掉正整数N后面的'\n'以使得后续输入正常。
  • 因为密码中可能含有空格符,所以不能使用scanf()输入,我选择使用fgets()输入,要注意fgets()会存储末尾的'\n'
  • 这里新学了<ctype.h>中的库函数isalpha()isdigit()用于字母和数字判断。

编写子函数judgePassword()进行逻辑判断和输出,第一次提交时testpoint1报wrong answer,检查后发现因为fgest()会存储末尾换行符,所以我这里判断密码长度时阈值应该+1,修改后AC。

My Code:

#include <stdio.h>
#include <string.h> // strlen header
#include <ctype.h> // isalpha header, isdigit header

#define MAX_LEN (80+2) // maxLen + '\n' + '\0'

void judgePassword(const char *password);

// first submit testpoint1 wrong answer
int main(void)
{
    int keyCount = 0;
    char password[MAX_LEN];
    int i=0; // iterator
    
    scanf("%d", &keyCount);
    getchar(); // consume the '\n' after keyCount
    
    for(i=0; i<keyCount; ++i)
    {
        // fgets store the '\n'
        fgets(password, MAX_LEN, stdin);
        //printf("%s", password); // test input
        judgePassword(password);
    }
    
    return 0;
}

void judgePassword(const char *password)
{
    int illegalFlag = 0;
    int letterFlag = 0;
    int digitFlag =0;
    int i=0; // iterator
    
    // here fixed testpoint1, for '\n' will let strlen +1
    if(strlen(password) < 6+1) // length is too short
    {
        printf("Your password is tai duan le.\n");
    }
    else // length meet require
    {
        i=0;
        while(password[i] != '\n') // traverse the password
        {
            //int isalpha(int c);
            if(isalpha(password[i]))
            {
                letterFlag = 1;
            }
            //int isdigit(int c);
            else if(isdigit(password[i]))
            {
                digitFlag = 1;
            }
            else if(password[i] != '.')
            {
                illegalFlag = 1;
            }
            ++i;
        }
        
        if(illegalFlag)
        {
            printf("Your password is tai luan le.\n");
        }
        else
        {
            if(letterFlag && !digitFlag)
            {
                printf("Your password needs shu zi.\n");
            }
            else if(digitFlag && !letterFlag)
            {
                printf("Your password needs zi mu.\n");
            }
            else if(digitFlag && letterFlag) // add this if doesn't pass testpoint1
            {
                printf("Your password is wan mei.\n");
            }
        }
    }
    
}