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

C++密码验证逻辑问题:不符合规则的字符串被误判为Valid

问题分析:密码验证程序误判原因

我尝试将某些字符串判定为Invalid,但输入类似59G71341、8pjf7h14sx13或60s1v344时,程序却输出Valid,求分析误判原因。

任务描述

声明一个名为goodPasswd的布尔变量。当secretStr包含不超过5个数字且长度大于等于5时,输出"Valid",否则输出"Invalid"。

示例:若输入为80796,输出为:
Valid

示例:若输入为XBdg,输出为:
Invalid

问题代码

#include <iostream>
using namespace std;

int main()
{
    string secretStr;

    bool goodPasswd = false;
    cin >> secretStr;
    int counter = 0;
    for (int i = 0; i < secretStr.length(); ++i)
    {
        if ((secretStr[i] >= 0) && (secretStr[i] <= 9))
        {
            ++counter;
        }
    }  //approves string if both true
    if ((counter <= 5) && (secretStr.length() >= 5))
    {
        goodPasswd = true;
    }
    else
    {
        goodPasswd = false;
    }

    if (goodPasswd)
    {
        cout << "Valid" << endl;
    }
    else
    {
        cout << "Invalid" << endl;
    }

    return 0;
}

误判原因

核心问题是判断数字字符的条件错误:

  • 在C++中,char类型存储的是字符的ASCII值,数字字符'0'的ASCII值是48,'9'是57。
  • 代码里用secretStr[i] >= 0 && secretStr[i] <=9,实际是判断字符的ASCII值是否在0-9之间,而所有字母、数字字符的ASCII值都远大于9,导致这些字符都不会被计数到counter里。
  • 比如输入59G71341,代码里的counter只会统计到0个数字(因为'5'的ASCII是53,远大于9),所以counter <=5的条件成立,加上字符串长度≥5,就误判为Valid。

修复方案

把判断数字的条件改成基于字符本身的比较:

if ((secretStr[i] >= '0') && (secretStr[i] <= '9'))

或者使用C++标准库的isdigit函数(需要包含<cctype>头文件):

#include <cctype>
// ...
if (isdigit(secretStr[i]))

内容的提问来源于stack exchange,提问作者Gabriel Zuniga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:11:07