You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修复说明

  1. 调整数组长度为9,避免内存溢出,修正scanf的参数错误。
  2. 改用has_upper标记是否存在大写字母,遍历完整个密码后再判断,不再中途退出。
  3. 用字符范围判断替代失效的isdigit,同时统计数字出现的次数,满足“至少3个”的要求。
  4. 统一用一个循环完成遍历,提升效率,避免重复遍历。

内容的提问来源于stack exchange,提问作者Thai Son Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:12:50