【问题标题】:Username and Password in CC语言中的用户名和密码
【发布时间】:2018-05-23 17:44:00
【问题描述】:

所以基本上我想创建一个程序,要求输入用户名和密码才能进入实际程序。我尝试做类似的事情,但是当我输入第一个用户名和密码时,它不会让我通过。另一方面,当我输入第二个用户名和密码时,它确实有效。谁能解释一下为什么?

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

【问题讨论】:

  • 您应该始终知道所有变量的值。输入names()pass()这两个函数时,i有什么值?

标签: c passwords


【解决方案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");


但是,您真正想要做的是定义这些变量 *out of 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" }
};

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      下面的代码不是你想要的:

      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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 2010-11-15
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多