为什么我在C代码中得到的结果(与第一个一样)?

时间:2018-07-07 16:33:03

标签: c codeblocks

我用C语言编写了此代码,以创建多个用户并使用在该程序中注册用户时提供的用户名和密码登录。但是我得到的结果与我的第一个动作相同。

例如,我已经使用uname注册为 test1 ,并通过了 test123 ,如果我在登录部分输入此密码,则会收到“登录成功”消息但是当我尝试输入任何随机uname并通过登录部分后,它将仅显示“登录成功”消息。当我退出并重新运行该程序时,如果在登录时输入错误的凭据,则会收到“无效的详细信息”消息,但此后,如果尝试使用正确的凭据登录,则也会得到“无效的详细信息”味精知道代码有什么问题吗?

情况1:使用正确的凭据。

输入1

用户名= test1

密码= test123

输出=登录成功

输入2

用户名=错误的用户名

密码=错误的密码

预期输出=无效的详细信息

但是我得到的输出=登录成功

情况2:首先使用错误的凭据

输入1

用户名=错误的用户名

密码=错误的密码

输出=无效的详细信息

输入2

用户名= test1

密码= test123

预期输出=登录成功

但是我得到的输出=无效的详细信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

struct database
{
  char user[20];
  char pass[20];
  char email[40];
}record;

int main()
{
    int count, choice, entries, i, j, ls, check=0;
    char mask;
    char fileDump[10000][50];
    char username[20];
    char password[20];
    FILE *fptr = fopen("E:\\login_practice.bin","ab+");
    char dump[256];
    Again:
    printf("Welcome to user authentication program v1.2\n");
    printf("\n1. Register\n");
    printf("\n2. Login\n");
    printf("\n3. Exit\n");
    printf("\nEnter your choice: ");
    scanf("%d", &choice);
    switch(choice)
    {
        case 1:
            printf("\nHow many user you want to register?\n");
            printf("\nUsers = ");
            scanf("%d", &entries);
            for(count=1; count<=entries; count++)
            {
                FILE *fp = fopen("E:\\email.bin", "ab+");
                printf("\nEnter your email: ");
                scanf("%s", &record.email);
                fprintf(fp, "%s\n", record.email);
                fclose(fp);

                printf("\nEnter a username: ");
                scanf("%s", &record.user);
                fprintf(fptr, "%s\n", record.user);

                printf("\nEnter a password: ");
                for(j=0; j<10; j++)
                {
                    mask = getch();
                    if(mask == 13)
                    {
                        break;
                    }
                    else
                    {
                        record.pass[j] = mask;
                        mask = '*';
                        printf("%c", mask);
                    }
                }
                fprintf(fptr, "%s\n", record.pass);
                printf("\nRegistration Successful.\n");
            }
            goto Again;
            break;

    case 2:
        i=0;
        while(fgets(dump, sizeof(dump),fptr))
        {
            strcpy(fileDump[i], dump);
            i++;
        }
        ls=i;
        printf("\nLines Scanned = %d\n", ls);
        printf("\nEnter your username: ");
        scanf("%s", &username);
        printf("\nEnter your password: ");
        for(j=0; j<10; j++)
        {
            mask = getch();
            if(mask == 13)
            {
                break;
            }
            else
            {
                password[j] = mask;
                mask = '*';
                printf("%c", mask);
            }
        }
        strcat(username, "\n");
        strcat(password, "\n");
        for(i=0; i<=ls; i+=2)
        {
            if(strcmp(fileDump[i], username)==0)
            {
                if(strcmp(fileDump[i+1], password)==0)
                {
                    check++;
                }
            }

        }
        if(check == 1)
        {
            printf("\nLogin Successful.\n");
        }
        else
        {
            printf("\nInvalid Details Entered!\n");
        }
        goto Again;
        break;

    case 3:
        exit(0);
        break;

    default:
        printf("\nBad Choice!\n");
        goto Again;
        break;
    }
fclose(fptr);
}

1 个答案:

答案 0 :(得分:0)

始终知道您的数据。 scanf不添加换行符。参见this.

因此,当您执行strcat(username, "\n");strcat(password, "\n");时,实际上将strcmp(fileDump[i], username)==0strcmp(fileDump[i+1], password)==0的结果转换为非零值。
也就是说,check++;行永远无法执行,因为上面的比较测试被认为是错误的。

请务必阅读评论中的建议;这一点很重要。 还要查看strcmpstrcat的文档。