c语言密码安全性检验

密码长度必须大于等于8个字符
必须包含大小写字母和数字字符
用户设置密码后给出相应提示:不符合安全性要求则提示“不成功”,显示原因,并要求重新进行设置;若符合要求则提示“设置成功!”,并结束程序运行。

完全根据你的要求来,基于new bing加以修改过后的编写:

实现思路:我们采用while循环不断要求用户输入密码,并进行判断,直到符合安全性要求为止。具体实现步骤如下:
【1】使用scanf()函数获取用户输入的密码字符串,并保存到字符数组变量password中。
【2】使用strlen()函数计算密码的长度,再使用isdigit()、islower()和isupper()等函数分别统计数字个数、小写字母个数和大写字母个数。
【3】对于符合要求的密码,输出“设置成功!”提示语句,并使用break语句跳出while循环,直接结束程序运行;对于不符合要求的密码,输出错误信息提示用户重新设置密码。
【4】在整个程序的末尾,在main函数中返回整数值0以表示程序正常运行结束。

img

#include <stdio.h>
#include <ctype.h> // 用于判断字符属性的头文件
#include <string.h> // 用于操作字符串的头文件

int main()
{
    char password[20]; // 假设密码不超过20个字符
    int length,i,num_count = 0, lower_count = 0, upper_count = 0;
    while (1) {
        printf("请设置您的密码:\n");
        scanf("%s", password);

       length = strlen(password);

        // 计算密码长度、数字个数、小写字母个数和大写字母个数
        for (i = 0; i < length; ++i) {
            if (isdigit(password[i]))
                num_count++;
            else if (islower(password[i]))
                lower_count++;
            else if (isupper(password[i]))
                upper_count++;
        }

        // 判断密码是否符合要求,若符合则输出“设置成功!”,并结束程序运行;否则输出错误信息,要求重新设置密码。
        if (length >= 8 && num_count > 0 && lower_count > 0 && upper_count > 0)
        {
            printf("设置成功!\n");
            break;
        }
        else
        {
            printf("不成功,密码需要满足以下要求:\n");
            printf("1. 长度大于等于8个字符。\n");
            printf("2. 包含至少一个数字字符,一个小写字母和一个大写字母。\n");
        }
    }

    return 0;
}



这个要用到正则来做比较容易了,有学过?没学过就看链接的if方法,不过我不太推荐;看看这个链接:https://blog.csdn.net/AMBER_MAY/article/details/114951635#:~:text=%E7%94%A8C%E8%AF%AD%E8%A8%80%E5%88%A4%E6%96%AD%E5%AF%86%E7%A0%81%E8%BE%93%E5%85%A5%E7%9A%84%E5%90%88%E6%B3%95%E6%80%A7%EF%BC%8C%E4%BB%A5%E6%9F%90%E5%9B%BE%E4%B9%A6%E9%A6%86%E7%B3%BB%E7%BB%9F%E4%B8%BA%E4%BE%8B%E3%80%82,%E8%A6%81%E6%B1%82%E5%A6%82%E4%B8%8B%EF%BC%9A%E5%AF%86%E7%A0%81%E9%9C%80%E5%9C%A88-16%E4%BD%8D%EF%BC%8C%E4%B8%94%E5%BF%85%E9%A1%BB%E5%8C%85%E5%90%AB%E5%A4%A7%E5%86%99%E5%AD%97%E6%AF%8D%EF%BC%8C%E5%B0%8F%E5%86%99%E5%AD%97%E6%AF%8D%E5%92%8C%E6%95%B0%E5%AD%97%EF%BC%8C%E4%B8%8D%E8%83%BD%E6%9C%89%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E3%80%82%20%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E5%A6%82%E4%B8%8B%EF%BC%9A
下面是我使用正则完成需求的code:

#include <stdio.h>
#include <regex.h>

int main() {
    char password[100]; 
    regex_t reg; 
    int ret; 
    printf("密码:");
    scanf("%s", password); 

    ret = regcomp(&reg, "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)[a-zA-Z\\\\d]{8,}$", REG_EXTENDED);

    if (ret != 0) {
        printf("编译失败!\\n");
        return 1; 
    }
    ret = regexec(&reg, password, 0, NULL, 0);

    if (ret == 0) {
        printf("right\\n"); 
    } else {
        printf("不成功!密码长度必须大于等于8个字符,且必须包含大小写字母和数字字符。\\n"); 
    }

    regfree(&reg);

    return 0;
}


封装了一个函数进行判断,运行结果如下:

img

代码:

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

int check(const char* pwd)
{
    int i, len;
    int flagBigChar = 0,flagSmlChar=0, flagNmb = 0; //是否包含大写字母、小写字母、数字
    len = strlen(pwd); //计算长度
    //1.判定长度
    if (len < 8)
    {
        printf("不成功:密码长度不足8位,请重新输入:");
        return -1; //返回-1,表示密码长度不足8位 
    }
        
    //2.判定是否包含大写字母和数字字符
    for (i = 0; i < len; i++)
    {
        if (pwd[i] >= 'A' && pwd[i] <= 'Z')
            flagBigChar = 1; //包含大写字母

        if (pwd[i] >= 'a' && pwd[i] <= 'z')
            flagSmlChar = 1; //包含小写字母

        if (pwd[i] >= '0' && pwd[i] <= '9')
            flagNmb = 1; //包含数字
    }
    if (flagBigChar == 1 && flagSmlChar == 1 && flagNmb == 1)
    {
        printf("设置成功!\n");
        return 1;
    }
    else
    {
        printf("不成功:密码必须包含");
        if (flagBigChar == 0)
            printf("大写字母");
        if (flagSmlChar == 0)
            printf("小写字母");
        if (flagNmb == 0)
            printf("数字");
        printf(",请重新输入:");
        return -2;
    }
}

int main()
{
    char buf[100] = { 0 };
    printf("请输入密码:");
    while (1)
    {
        scanf("%s",buf);
        if (check(buf) == 1)
            break;
    }
    return 0;
}



```c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char password[20];
    int length, has_digit, has_upper, has_lower;
    
    do {
        printf("请输入密码:");
        scanf("%s", password);
        
        length = strlen(password);
        has_digit = has_upper = has_lower = 0;
        
        if (length < 8) {
            printf("密码长度必须大于等于8个字符\n");
        }
        else {
            for (int i = 0; i < length; i++) {
                if (isdigit(password[i])) {
                    has_digit = 1;
                }
                else if (isupper(password[i])) {
                    has_upper = 1;
                }
                else if (islower(password[i])) {
                    has_lower = 1;
                }
            }
            if (!has_digit || !has_upper || !has_lower) {
                printf("密码必须包含大小写字母和数字字符\n");
            }
            else {
                printf("设置成功!\n");
                return 0;
            }
        }
    } while (1);
}


```

可以一试

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

int main() {
    char password[100];
    printf("请输入密码: ");
    scanf("%s", password);

    int length = strlen(password);
    if (length < 8) {
        printf("不成功,密码长度必须大于等于8个字符\n");
        return 0;
    }

    int hasUpper = 0, hasLower = 0, hasDigit = 0;
    for (int i = 0; i < length; i++) {
        if (isupper(password[i])) hasUpper = 1;
        if (islower(password[i])) hasLower = 1;
        if (isdigit(password[i])) hasDigit = 1;
    }

    if (!hasUpper || !hasLower || !hasDigit) {
        printf("不成功,密码必须包含大小写字母和数字字符\n");
        return 0;
    }

    printf("设置成功!\n");
    return 0;
}

可以借鉴下

#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;
}