C语言实现密码检查

这道题目并不算难,实现时可能会写出一些bug,需要耐心去调试。有两种方法,首先这些题目要求可以频繁使用字符串的库函数,这里不介绍这些库函数,我的方法是直接比较阿斯克码值的大小进行删选,频繁使用if语句。代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char arr[101] = { 0 };
	int n = 0;
	scanf("%d", &n);                                 //输入要检查的密码的个数
	getchar();
	for (int i = 0; i < n; i++)
	{
		int a = 0;
		int b = 0;
		int c = 0;
		int flag = 0;
		scanf("%s", arr);
		getchar();                                    //吸收回车键
		for (int j = 0; j < strlen(arr); j++)
		{
			if (strlen(arr) < 8)                      //4. 密码长度至少为8
			{
				flag = 1;
				printf("NO\n");
				break;
			}
			if ((arr[0] > '0') && (arr[0] < '9'))     //2.密码不能以数字开头;
			{
				flag = 1;
				printf("NO\n");
				break;
			}
			if (!(((arr[j] >= '0') && (arr[j] <= '9')) || ((arr[j] >= 'A') && (arr[j] <= 'Z')) || ((arr[j] >= 'a') && (arr[j] <= 'z'))))    //1.密码只能由大写字母,小写字母,数字构成;
			{
				flag = 1;
				printf("NO\n");
				break;
			}
			if ((arr[j] > '0') && (arr[j] < '9'))               
			{
				a = 1;
			}
			if ((arr[j] > 'A') && (arr[j] < 'Z'))
			{
				b = 1;
			}
			if ((arr[j] > 'a') && (arr[j] < 'z'))
			{
				c = 1;
			}
			if ((j == strlen(arr) - 1) && (a + b + c < 2))  //3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
			{
				flag = 1;
				printf("NO\n");
				break;
			}
		}
		if (flag == 0)
		{
			printf("YES\n");
		}
	}
	system("pause");
	return 0;
}

 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是使用C语言实现仿射密码的示例代码: ```c #include <stdio.h> #include <string.h> #include <ctype.h> int gcd(int a, int b) { if (b == 0) { return a; } else { return gcd(b, a % b); } } int mod_inverse(int a, int m) { int x0 = 1, x1 = 0, y0 = 0, y1 = 1; int r0 = a, r1 = m, q, r, x, y; while (r1 != 0) { q = r0 / r1; r = r0 % r1; x = x0 - q * x1; y = y0 - q * y1; r0 = r1; r1 = r; x0 = x1; x1 = x; y0 = y1; y1 = y; } if (r0 > 1) { return -1; } if (x0 < 0) { x0 += m; } return x0; } int is_valid_key(int k, int m) { return gcd(k, m) == 1; } void affine_encrypt(char *plaintext, int k, int b, char *ciphertext) { int i, x, y; for (i = 0; i < strlen(plaintext); i++) { if (isalpha(plaintext[i])) { x = toupper(plaintext[i]) - 'A'; y = (k * x + b) % 26; ciphertext[i] = 'A' + y; } else { ciphertext[i] = plaintext[i]; } } ciphertext[i] = '\0'; } int main() { char plaintext[100], ciphertext[100]; int k, b; printf("请输入明文:"); gets(plaintext); printf("请输入密钥k和b:"); scanf("%d%d", &k, &b); if (!is_valid_key(k, 26)) { printf("无效的密钥!\n"); return 0; } affine_encrypt(plaintext, k, b, ciphertext); printf("密文为:%s\n", ciphertext); return 0; } ``` 这个代码,我们使用了两个辅助函数gcd和mod_inverse,分别用于求最大公约数和模反元素。is_valid_key函数用于检查密钥是否有效,即要求密钥k与模数26互质。affine_encrypt函数用于对明文进行加密,具体实现和前面介绍的算法类似。需要注意的是,这个程序只能处理大小写字母,如果要处理数字或其他字符,需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数九天有一个秘密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值