为什么验证密码的代码总是拒绝输入?

时间:2014-08-21 19:56:14

标签: c character-arrays

我尝试编写一个读取密码的程序,只有当它包含美元符号,大写字母和数字时才接受它。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    int i=0;
    char chr;
    int dollar,upperC,number=0;
    char password[100];

    printf("enter the password\n\n");
    scanf("%s",password);

    for( i=0;i<=99;i++){
        chr=password;

        if(chr=='$'){
            dollar=1;
        }
        if(isdigit(chr)){
            number=1;
        }
        if(isalpha(chr)){
            if(isupper(chr)){
                upperC=1;
            }
        }
        if(dollar==1&&number==1&&upperC==1){
            printf("your password has accepted");
        }else{
            printf("your password has not accepted");
        }
        return 0;
    }
}

然而,该程序似乎拒绝所有密码,即使是满足条件的密码。有人可以帮我看看为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

该计划有几个问题;这里有几个。作为一个注释,大多数这些可能会被C编译器捕获,警告级别一直上升到最大值,所以我建议打开警告并确保程序在运行之前干净地编译。话虽如此,这里有一些特定的错误:

写作时

int dollar,upperC,number=0;

C将此解释为等同于

int dollar;
int upperC;
int number = 0;

如您所见,dollarupperC未初始化,因此其值未定义(但通常不为零)。尝试更改代码,通过编写

将其设置为零
int dollar = 0, upperC = 0, number = 0;

或者,甚至更好,包括<stdbool.h>并写

bool dollar = false, upperC = false, number = false;

此外,请注意您的if / else密码测试位于for循环内,这意味着您将测试是否所有字符类型都存在而未查看所有可能的输入中的字符。要解决此问题,请将if / else移到循环之外。

此行也不正确:

chr=password;

这不会将chr设置为password的下一个字符。我想你的意思是

chr = password[i];

最后,确保不要循环到索引99(包括99)。这可能会超过字符串的结尾。相反,只循环到字符串中的逻辑字符数。

希望这有帮助!

答案 1 :(得分:0)

我觉得你的逻辑存在问题

if(dollar==1&&number==1&&upperC==1)

不正确,因为它在forloop中 您正在评估char并查看它是否全部(美元,数字和上限C)

此外,我认为您正试图评估每个字符,以便您需要

chr = password[i];