-2

我试图编写一个程序来读取密码并仅在密码包含美元符号、大写字母和数字时才接受密码。这是代码:

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

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

4

2 回答 2

4

这个程序有几个问题;这里有几个。需要注意的是,其中大多数可能会被 C 编译器捕获,并且警告级别会一直上升到最大值,因此我建议打开警告并确保在运行程序之前可以干净地编译它们。话虽如此,以下是程序中的一些特定错误:

当你写

int dollar,upperC,number=0;

C 将其解释为等价于

int dollar;
int upperC;
int number = 0;

如您所见,dollar并且upperC未初始化,因此它们的值未定义(但通常不为零)。尝试通过编写更改您的代码以将这些设置为零

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,包括索引。这可能会读到字符串的末尾。相反,只循环到字符串中的逻辑字符数。

希望这可以帮助!

于 2014-08-21T19:59:31.923 回答
0

好吧,我认为您的逻辑有问题

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

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

另外我认为您正在尝试评估每个字符,因此您需要

chr = password[i]; 
于 2014-08-21T20:03:41.807 回答