密码验证 Else 语句在不应该触发时触发

Password Validation Else Statement Firing When It Shouldn't

我正在尝试在 C 中验证密码,并且我的 else 语句之一会在代码 运行s 时自动触发。我 运行 测试一个字符是否是一个符号,如果它是使用 symbol++;int symbol 加 1,但问题是无论字符是否我正在测试是一个符号。

我认为这个问题与我的 if, else 语句的结构有关,我已经尝试了几种组合,但是有些错误导致程序中断我使用了 else if 但这没有帮助。这看起来应该很明显,但我似乎无法弄清楚哪里出了问题。

char password[30];
int lower, upper, number, symbol, i;
lower = upper = number = symbol = 0;

printf("Enter your password: ");
scanf("%s", &password);

int len = strlen(password);

for (i = 0; i <= len; i++) {

    if (isalpha(password[i])){

        if (isupper(password[i])){
            upper++;
        }

        else{
            lower++;
        }
    }

    if (isdigit(password[i])){
        number++;
    }

    else{
        symbol++;
    }
}

if (upper >= 1 && lower >= 1 && number >= 1 && symbol >= 1 && len >=6){

    printf("Your password is good!");

}

if (upper < 1){

    printf("You need an uppercase letter \n");

}

if (lower < 1){

    printf("You need a lowercase letter \n");

}

if (number < 1){

    printf("You need a number \n");

}

if (symbol < 1){

    printf("You need a symbol \n");

}

if (len < 6){

    printf("Your password must be at least 6 characters \n");

}

在您的代码中,更改

for (i = 0; i <= len; i++) 

for (i = 0; i < len; i++) 

as,C 数组具有基于 0 的索引。否则,您 可能会 超出分配的内存,这反过来会调用 undefined behaviour.

注意:即使你没有溢出内存(因为你有一个编译时分配的数组并且输入可能小于实际数组大小),你也会结束比较终止 nul,这可能是您不想要的。

然后,isdigit() 检查不应该是 standalone if(按照你的逻辑),它应该是 else if with isalpha().

也就是说,

 scanf("%s", &password);

应该是

 scanf("%29s", &password);

以避免任何可能的缓冲区溢出风险。

symbol++;

将在输入字母时执行。

为防止出现这种情况,请在 isdigit 测试之前插入 else

else if (isdigit(password[i])) {

正如其他人指出的那样,循环也不正确。应该是

for (i = 0; i < len; i++) {

您的代码如下所示:

if (cond1){}
if (cond2){}
else {}

在这种情况下,else 块的执行独立于 cond1 块,如 C11 标准草案第 6.8.4.1 节 $3 所述:An else is associated with the lexically nearest preceding if that is allowed by the syntax.

您可以将代码结构更改为:

if (cond1){}
else if (cond2){}
else {}