B3843 [GESP202306 三级] 密码合规(洛谷)(c语言)

题目描述

网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。

  1. 只能由 a∼za∼z 之间 2626 个小写字母、A∼ZA∼Z 之间 2626 个大写字母、0∼90∼9 之间 1010 个数字以及 !@#$ 四个特殊字符构成。

  2. 密码最短长度 :6:6 个字符,密码最大长度 :12:12 个字符。

  3. 大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。

输入格式

输入一行不含空格的字符串。约定长度不超过 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。

输出格式

输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。

输入输出样例

输入 #1

seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

输出 #1

seHJ12!@
sjdkffH$123

说明/提示

【样例 1 解释】

输入被英文逗号分为了四组被检测密码:seHJ12!@sjdkffH$123sdf!@&12HDHa!123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。

ps:由于我是用c语言写的,那就按照c的思路来分析,代码应该可以再优化或者有其他写法,大家有其他意见也可以分享一下,不多说,先上代码。

#include <stdio.h>
#include <string.h>
int main()
{
	char str[101];
	//gets(str);
	scanf("%s",str);
	getchar();//清除缓冲区的'\n',不过后面没有输入,不写这个也行 
	int len = strlen(str);
	int i = 0;
	int q = 0;//j的起始 
	for(int k = 0; k < len; k++)
	{
		int cnt = 0;
		int da = 0,x = 0,c = 0,s = 0;//大写,小写,字符,数字 
		int flag = 1;//非法字符判断 
		for(; str[i] != ',' && str[i] != '\0';i++){
			cnt++;//这里要注意末尾情况 
		}
		if(cnt < 6 || cnt > 12) {
			i++;
			q = i;//记录跳过点 
			continue;
		}
		for(int j = q; j < i; j++){
			//if里面的语句也可以写成赋值为1的形式 
			if(str[j] >= 'a' && str[j] <= 'z')
			x++;
			else if(str[j] >= 'A' && str[j] <= 'Z')
			da++;
			else if(str[j] >= '0' && str[j] <= '9')
			s++;
			else if(str[j] == '!' || str[j] == '@' || str[j] == '#' || str[j] == '$')
			c++;
			else
			flag = 0; 
		}
		if(((da && x) || (da && s) || (x && s)) && c && flag){
			for(int j = q; j < i; j++){
				printf("%c",str[j]);
			}
			printf("\n");
		}
		
		i++;//跳过逗号 
		q = i;
	}
    return 0;
}

测试点信息

自己写的过程中遇到的问题:

1.一开始没注意到非法字符也需要判断,还好后面补上了,大家也要看清题目,不然容易吃亏

2.这点折磨了我挺久的,就是写完后发现自己的代码一直是RE的状态,毕竟编译器上运行没有问题,调试也找不出来,后面怎么发现的呢?(博主是新手,不要喷我)经过高人指点

发现我箭头所指的值不是0,那就是程序跑的过程中崩溃了,原来是我没有考虑到输入的字符串中最后的位置是没有英文逗号的,而我没有加上判断(以下为出错原代码)

之后加了个对末尾的判断条件就对了(以下为改正后代码)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值