C中的用户名和密码

时间:2017-12-09 18:49:04

标签: c passwords

所以基本上我想创建一个程序,要求输入用户名和密码才能输入实际的程序。我尝试过这样的事情,但是当我输入第一个用户名和密码时,它并没有让我通过。另一方面,当我键入第二个用户名和密码时,它确实有效。有人能解释我为什么吗?

    #include<stdio.h>
    #include<string.h>
    #define MAX 100
    #define LEN 40

    int names(char listName[][LEN]);
    void pass(char listPass[][LEN]);

    int main()
    {
    char name[LEN];
    char password[LEN];
    char listName[MAX][LEN];
    char listPass[MAX][LEN];
    int i;

    names(listName);
    pass(listPass);


    printf("Enter username: ");
    scanf("%s", name);

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

    for(i = 0; i< 2; i++)
    {
        if (strcmp(listName[i], name) == 0 && strcmp(listPass[i], password) == 0)
        {
            printf("Access granted\n");
            break;
        }
        else 
        {
            printf("Access denied\n");
            break;
        }
    }

    getch();
    }

    int names(char listName[][LEN])
    {
        int i;
        strcpy(listName[i], "Vince");
        strcpy(listName[i], "Jeremy");
    }

    void pass(char listPass[][LEN])
    {
        int i;
        strcpy(listPass[i], "aBc2xyz8");
        strcpy(listPass[i], "fa7saC12");
    }

3 个答案:

答案 0 :(得分:1)

在启用警告的情况下进行编译,您可以看到变量i未使用在此处初始化:

int names(char listName[][LEN])
{
    int i;
    strcpy(listName[i], "Vince");
    strcpy(listName[i], "Jeremy");
}

void pass(char listPass[][LEN])
{
    int i;
    strcpy(listPass[i], "aBc2xyz8");
    strcpy(listPass[i], "fa7saC12");
}

您现在拥有的是未定义的行为,即任何事情都可能发生。你很可能会随机崩溃。

您的意思是strcpy(listName[0], "Vince");strcpy(listName[1], "Jeremy");

但是,您 想要做的是从main中定义这些变量*,并在那里初始化它们。此外,通过使用指向char的指针数组,允许使用不同长度的密码和用户名。例如:

char *listName[MAX] = { "Vince", "Jeremy" };
char *listPass[MAX] = { "aBc2xyz8", "fa7saC12" };

int main(void) { ...

甚至更好,使用用户数据结构:

struct user_data {
    char *username, *password;
};

struct user_data users[MAX] = {
    { "Vince", "aBc2xyz8" },
    { "Jeremy", "fa7saC12" }
};

答案 1 :(得分:1)

在names()和pass()中使用i未初始化,两个strcpy操作都将复制到同一个数组索引。

答案 2 :(得分:0)

以下代码不是您的意图:

int names(char listName[][LEN])
{
     int i;
     strcpy(listName[i], "Vince");
     strcpy(listName[i], "Jeremy");
}

void pass(char listPass[][LEN])
{
    int i;
    strcpy(listPass[i], "aBc2xyz8");
    strcpy(listPass[i], "fa7saC12");
}

您应该初始化i并在语句之间递增,或者只使用:

int names(char listName[][LEN])
{
    strcpy(listName[0], "Vince");
    strcpy(listName[1], "Jeremy");
}

void pass(char listPass[][LEN])
{
    strcpy(listPass[0], "aBc2xyz8");
    strcpy(listPass[1], "fa7saC12");
}