C程序-PAT-1081 检查密码

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

输入格式:

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

输出格式:

对每个用户的密码,在一行中输出系统反馈信息,分以下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.

输入样例:

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

输出样例:

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.

C程序-PAT-1081 检查密码

思路分析:题目并不难,需要注意的是,这里字符串输入不能用scanf(),因为不能保证输入的数据没有空格

#include <iostream>
#include <stdio.h>
#include <string.h>

const int N=128;

int solve(char *s,int len);
int legitimate(char c);//判断字符是否合法函数 

int main( ) 
{
	char str[N];
	int n,i,len;
	
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		fgets(str,N,stdin);//接收字符串 
//		scanf("%s",str);//不能用scanf(),不能保证输入的数据没有空格 
		len=strlen(str)-1;//根据fgets特性,长度需要减1 
		solve(str,len);
	}
	return 0;
}

int solve(char *s,int len)
{
	if(len<6)//密码太短
	{
		printf("Your password is tai duan le.\n");
		return 0;
	}
	
	int i,arr[5]={0};
	for(i=0;i<len;i++)//统计各种字符出现次数 
	{
		arr[legitimate(s[i])]++;	
	}
	
	if(arr[0])//存在不合法字符
	{
		printf("Your password is tai luan le.\n");
		return 0;
	}
	
	if(!arr[2])//只有字母没有数字 
	{
		printf("Your password needs shu zi.\n");
		return 0;
	}
	else if(!arr[1])//只有数字没有字母 
	{
		printf("Your password needs zi mu.\n");
		return 0;
	}
	else //密码合法 
	{
		printf("Your password is wan mei.\n");
		return 0;
	}
}

int legitimate(char c)
{
	//字母返回1 
	if(c>='a'&&c<='z')
		return 1;
	if(c>='A'&&c<='Z')
		return 1;
	//数字返回2	
	if(c>='0'&&c<='9')
		return 2;
	//小数点返回3 
	if(c=='.')
		return 3;
	//其他字符返回0 
	return 0;
}