一、题目描述
编写 C 语言程序,实现密码验证 + 强度检测双功能,具体需求如下:
预设正确密码:固定为字符串"Cstudy123"(大小写敏感);
第一步:用户输入密码(长度限制 6~16 位,超出范围提示重输);
第二步:密码合法性校验:长度必须 6~16 位,非法则循环提示重输;
第三步:密码验证:输入正确则提示 “密码验证成功”,错误则提示 “密码错误,请重新输入”,最多给 3 次输入机会,3 次全错直接退出程序;
第四步:验证成功后,自动检测密码强度,输出强度等级(弱 / 中 / 强),检测规则见题目要求。
二、题目要求
必须使用字符数组存储密码(禁止指针进阶用法),预设密码固定,禁止修改;
核心功能独立封装成 3 个函数:密码长度校验、密码强度检测、密码验证逻辑,禁止所有代码写在 main 函数;
严格输入规则:密码只能输入可见字符(无需特殊校验,仅限制长度 6~16 位),支持输入带字母、数字的组合;
密码强度检测规则(3 条,满足对应条件判定等级):
弱:仅包含纯字母 或 纯数字;
中:同时包含字母 + 数字,无其他要求;
强:同时包含大写字母 + 小写字母 + 数字;
输出格式清晰:分模块展示输入提示、验证结果、强度等级,语言简洁,无冗余信息,适合博客排版展示。
三、输入输出示例(3 种场景,覆盖所有需求)
示例 1:验证成功 + 密码强度 “强”
plaintext
===== 密码验证系统 =====
请输入密码(长度6~16位):Cstudy123
密码验证成功!
密码强度检测结果:强
示例 2:密码长度非法 + 3 次输入错误退出
plaintext
===== 密码验证系统 =====
请输入密码(长度6~16位):123
输入非法!密码长度必须6~16位,请重输:C123
输入非法!密码长度必须6~16位,请重输:abcdefg
密码错误,剩余2次机会
请输入密码(长度6~16位):12345678
密码错误,剩余1次机会
请输入密码(长度6~16位):abc123456
密码错误,3次机会已用完,程序退出!
示例 3:验证成功 + 密码强度 “中 / 弱”
plaintext
===== 密码验证系统 =====
请输入密码(长度6~16位):cstudy123
密码验证成功!
密码强度检测结果:中
===== 密码验证系统 =====
请输入密码(长度6~16位):cstudyabc
密码验证成功!
密码强度检测结果:弱
四、解题思路引导
拿到题目不用慌,按 4 步拆解,逻辑超清晰,博客里也能同步这个思路引导,方便读者理解:
预设固定密码:定义字符数组存储预设密码"Cstudy123",全程固定不变;
分层输入校验:先校验密码长度(6~16 位),非法则循环重输,再进行密码匹配验证;
封装核心函数:
长度校验函数:接收密码数组,返回 1(合法)/0(非法),判断长度是否 6~16 位;
强度检测函数:接收密码数组,遍历字符,统计是否含大写、小写、数字,按规则返回 “弱 / 中 / 强”;
密码验证函数:接收输入密码和预设密码,返回 1(匹配成功)/0(失败);
次数控制逻辑:用循环控制最多 3 次输入机会,每次失败提示剩余次数,3 次全错直接退出,成功则调用强度检测函数输出结果。
五、完整参考代码
c
运行
#include <stdio.h>
#include <string.h>
// 预设正确密码(固定不变,大小写敏感)
#define RIGHT_PASSWORD "Cstudy123"
// 密码长度限制
#define MIN_LEN 6
#define MAX_LEN 16
// 函数声明(3个核心功能,新手友好,结构清晰)
// 1. 校验密码长度:返回1=合法,0=非法
int checkLength(char pwd[]) {
int len = strlen(pwd);
if (len >= MIN_LEN && len <= MAX_LEN) {
return 1;
}
return 0;
}
// 2. 检测密码强度:返回"弱"/"中"/"强"
char* checkStrength(char pwd[]) {
int hasUpper = 0; // 是否含大写字母
int hasLower = 0; // 是否含小写字母
int hasDigit = 0; // 是否含数字
// 遍历密码每个字符,标记类型
for (int i = 0; pwd[i] != '\0'; i++) {
if (pwd[i] >= 'A' && pwd[i] <= 'Z') {
hasUpper = 1;
} else if (pwd[i] >= 'a' && pwd[i] <= 'z') {
hasLower = 1;
} else if (pwd[i] >= '0' && pwd[i] <= '9') {
hasDigit = 1;
}
}
// 按规则判定强度
if (hasUpper && hasLower && hasDigit) {
return "强";
} else if ((hasUpper || hasLower) && hasDigit) {
return "中";
} else {
return "弱";
}
}
// 3. 密码验证:返回1=匹配成功,0=失败
int checkPassword(char inputPwd[], char rightPwd[]) {
if (strcmp(inputPwd, rightPwd) == 0) {
return 1;
}
return 0;
}
int main() {
char inputPwd[20]; // 存储输入密码,预留足够空间
int chance = 3; // 初始3次输入机会
printf("===== 密码验证系统 =====\n");
// 循环控制3次输入机会
while (chance > 0) {
printf("请输入密码(长度%d~%d位):", MIN_LEN, MAX_LEN);
scanf("%s", inputPwd); // 无空格密码
// 第一步:校验密码长度
if (!checkLength(inputPwd)) {
printf("输入非法!密码长度必须%d~%d位,请重输:\n", MIN_LEN, MAX_LEN);
continue;
}
// 第二步:密码验证
if (checkPassword(inputPwd, RIGHT_PASSWORD)) {
printf("密码验证成功!\n");
// 第三步:检测并输出密码强度
char* strength = checkStrength(inputPwd);
printf("密码强度检测结果:%s\n", strength);
break; // 验证成功,退出循环
} else {
// 密码错误,减少一次机会
chance--;
if (chance > 0) {
printf("密码错误,剩余%d次机会\n", chance);
} else {
printf("密码错误,3次机会已用完,程序退出!\n");
}
}
}
return 0;
}
六、易错点总结
预设密码大小写敏感:C 语言中strcmp函数严格区分大小写,输入cstudy123和Cstudy123判定为不同密码,这是题目要求,也是新手易忽略点;
密码长度统计:必须用strlen获取密码实际长度,不能手动计数,避免输入带隐藏字符导致统计错误;
强度检测标记逻辑:遍历字符时,只要出现对应类型就标记为 1,后续无需重复标记,比如多个大写字母只需要标记一次hasUpper=1;
3 次机会控制:每次密码错误后chance--,当chance=0时直接退出,不能继续循环,避免无限输入。