1081 检查密码

题目链接
这道题题目核心思想为判断字符是否合理,不难但是一些细节扣了很久才保证样例全对;
即:对于数据的读取
1.0 最开始我运用的是cin来读取字符串,因为根据题目的要求,为非空字符串;以为不会有空格字符;造成了错误;
2.0 因为gets函数在pat里无法使用,所以我运用了fgets,一开始使用忘记了他会吸收回车,之前也写了getchar();来做回车的吸收,所以导致错误;
后来改完之后还是发现错误,细查了一下;发现fgets:fgets()函数读取文件时遇到文件结束符EOF 和 换行符即结束,并在接收缓存中的最后一个字符后面添加一个’\0’,所以fgets函数的第二个参数n我们可以理解为:若读取的字符数小于n,则会全部读取并且在最后一个字符后面添加’\0’,若读取的字符数等于n,则最多读取n-1个字符,第n个字符为’\0’。
在读取stdin时,我们输入回车代表输入结束,回车符会被fgets一起读进缓存。处理情况同上面的一样。
**不能确定他是否吸取回车符(似乎可以用字符串长短来判断)**什么时候读取时字符串长度-1,什么时候不减;
3.0 运用了 *scanf("% [ ^\n]%c", a); 读到’\n’结束读取,并将其读到的数据抛弃,然后再抛弃一个字符(这个字符是’\n’)
完成了测试;
ps:我以为需考虑字符串>80情况,但似乎并不用考虑;
代码如下;

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#pragma warning(disable:4996);
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<math.h>
using namespace std;
int main()
{
	int n;
	cin >> n;
	getchar();
	for (int i = 1;i <= n;i++)
	{
		char a[100];
		scanf("%[^\n]%*c", a);
		int l = strlen(a);
		if (l < 6) {
			cout << "Your password is tai duan le." << endl;
		}
		else  {
			int flag1, flag2, flag3;//分别检测数字,字母,小数点;
			int flag4 = 1;//控制密码不符合与密码缺东西重复输出;
			flag1 = flag2 = flag3 = 0;
			for (int i = 0;i < l - 1;i++)
			{
				if (a[i] <= '9' && a[i] >= '0') flag1 = 1;
				else if (a[i] <= 'Z' && a[i] >= 'A') flag2 = 1;
				else if (a[i] <= 'z' && a[i] >= 'a') flag2 = 1;
				else if (a[i] == '.') flag3 = 1;
				else {
					cout << "Your password is tai luan le." << endl;
					flag4 = 0;
					break;
				}
			}
			if (flag4 == 1 && flag1 == 1 && flag2 == 1) cout << "Your password is wan mei." << endl;
			if (flag4 == 1 && flag1 == 1 && flag2 == 0) cout << "Your password needs zi mu." << endl;
			if (flag4 == 1 && flag1 == 0 && flag2 == 1) cout << "Your password needs shu zi." << endl;
		}
	}
	return 0;
}



//fgets()函数读取文件时遇到文件结束符EOF 和 换行符即结束,并在接收缓存中的最后一个字符后面添加一个'\0',所以fgets函数的第二个参数n我们可以理解为:若读取的字符数小于n,则会全部读取并且在最后一个字符后面添加'\0',若读取的字符数等于n,则最多读取n-1个字符,第n个字符为'\0'。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值