CodeBlocks密码验证程序:isdigit函数失效、提示不显示问题求助
密码验证程序问题修复
原代码的核心问题
- 数组越界与scanf错误:
char password[8];无法容纳8个字符加终止符\0,会导致内存溢出;scanf("%s", &password);多了取地址符,数组名本身就是地址。 - 大写检查逻辑完全反转:原代码只要碰到大写字母就直接
return 1退出,等于要求密码不能有大写,完全违背需求;而且else if (password[Upper] == '\0');后面的分号会让后续printf和return无条件执行,不管有没有遍历到字符串结尾。 - 数字检查的双重问题:一是依赖失效的
isdigit函数,二是逻辑反转(碰到数字就退出),三是没统计数字数量,无法满足“至少3个数字”的要求。 - 循环逻辑错误:固定循环8次,没有考虑字符串终止符,可能会遍历到无效内存。
修复后的代码
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { int has_upper = 0; int digit_count = 0; // 定义足够长度的数组,容纳8字符+终止符 char password[9]; printf("enter password:"); // 数组名直接作为参数,无需取地址 scanf("%s", password); // 检查密码长度 if (strlen(password) < 8) { printf("password have insufficient length!\n"); return 1; } // 遍历密码,检查大写字母并统计数字数量 for (int i = 0; password[i] != '\0'; i++) { // 检查大写字母 if (isupper(password[i])) { has_upper = 1; } // 替代失效的isdigit,通过字符范围判断数字 if (password[i] >= '0' && password[i] <= '9') { digit_count++; } } // 验证大写字母是否存在 if (!has_upper) { printf("password should contain at least 1 upper case character!\n"); return 1; } // 验证数字数量是否达标 if (digit_count < 3) { printf("password should contain at least 3 digits!\n"); return 1; } printf("Password created successfully\n"); return 0; }
关键修复说明
- 调整数组长度为9,避免内存溢出,修正scanf的参数错误。
- 改用
has_upper标记是否存在大写字母,遍历完整个密码后再判断,不再中途退出。 - 用字符范围判断替代失效的
isdigit,同时统计数字出现的次数,满足“至少3个”的要求。 - 统一用一个循环完成遍历,提升效率,避免重复遍历。
内容的提问来源于stack exchange,提问作者Thai Son Nguyen
相关产品推荐
相关产品推荐

