C编程登录系统

时间:2017-04-22 06:05:01

标签: c

我试图基于txt制作简单的登录系统。 file看起来像

1 1
2 2
3 3

但我的代码只检查txt的最后一行,而不是每一行。

int write_login_and_pass() {
    char login[30], pass[30];
    int select3;

    printf("\n|---------Login:");
    scanf("%s", login);
    printf("|---------Password:");
    scanf("%s", pass);

    sign_In(login, pass);
    _getch();
    system("PAUSE");
    return 0;
}
int sign_In(char login[30], char pass[30]) {
    FILE *file;
    char user2[30], pass2[30], fc;
    file = fopen("Customers.txt", "r");
    char arra[128][128];

    if (file != NULL) {
        char line[128];
        do {
            fscanf(file, "%29s %29s", user2, pass2);
        }while (fgets(line, sizeof line, file) != NULL); 
                if ((strcmp(login, user2) == 0) && (strcmp(pass, pass2) == 0)) {
                    printf("\n>>>User and password correct!<<<\n");
                    fc = main_menu();
                }
                else {
                    printf("\n>>>User or password incorrect!<<<\n");
                    system("PAUSE");
                    fc = sign_In(login, pass);
                }
    }
    else printf("File was not founded");
    fclose(file);
    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题出在这里:

char user2[30], pass2[30], fc;
file = fopen("Customers.txt", "r");
if (file)
{
    while(fscanf(file, "%29s %29s", user2, pass2) == 2)
    {
        // do comparisons here
    }
    fclose(file);
}

首先,你读了一对用户密码1),然后你尝试来读取第2行的结尾 - 但是在成功时,就像在while循环中一样,你重新进入在评估到目前为止读取的密码之前......

现在有两个选项,首先是简单的选项:

u1 p1
u2
p2 u3
p3 u4 p4

请注意,绝对依赖于正确的文件格式,i。即总是关注一个用户后跟他/她的相关密码 - 顺便说一下,空格无关紧要,所以文件甚至可能是这样的:

char user2[30], pass2[30], line[128];
file = fopen("Customers.txt", "r");
if (file)
{
    while(fgets(line, sizeof line, file)
    {
        if(sscanf(line, "%29s %29s", user2, pass2) == 2)
        // ^  (!)
        {
            // do comparisons here
        }
        // else: line is invalid!
    }
    fclose(file);
}

但是,其中一对失踪,你的登录完全坏了!

第二个选项:逐行阅读:

char *user2, *pass2, line[128];
file = fopen("Customers.txt", "r");
if (file)
{
    while(fgets(line, sizeof line, file)
    {
        if((user2 = strtok(line, " \t") && (pass2 = strtok(NULL, " \t"))
        {
            // do comparisons here
        }
        // else: line is invalid!
    }
    fclose(file);
}

我个人更喜欢strtok而不是sscanf,因为你不必这样复制字符串:

{{1}}

(唯一的缺点:strtok不是thread safe