gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:30:19 25 4
gpt4 key购买 nike

我用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);
}

最佳答案

始终了解您的数据。scanf 不附加换行符。请参阅this.

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

请务必阅读评论中的建议;这一点很重要。另请查看 strcmp 的文档和 strcat .

关于c - 为什么我在 C 代码中得到相同的结果(与第一个结果相同)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com